类的继承

  • 新式类,广度优先,先在水平方向查找,然后再向上查找。
  • 经典类,深度优先。
Python3 取消了经典类,默认都是新式类,并且不必显式的继承object
class Person(object):pass
class Person():pass
class Person:pass
三种写法无区别
Python2 默认都是经典类,只有显示继承object才是新式类
class Person(object):pass 新式类
class Person():pass 经典类
class Person:pass 经典类

调用父类属性

  • 第一种方法:
class A:
	def __init__(self):
		self.name = "xiaoming"
	def run(self):
		print("A")


class B(A):
	def __init__(self):
		#继承父类属性,__init__是重写父类的方法
		A.__init__(self)
		self.name_b = "zhangshan"
	def fun(self):
		print("B")

print(B().name)
print(B().name_b)

xiaoming
zhangshan
[Finished in 1.0s]
  • 第二种方法:推荐( super 继承只能用于新式类,用于经典类就会报错)
class A:
	def __init__(self):
		self.name = "xiaoming"
	def run(self):
		print("A")


class B(A):
	def __init__(self):
		#继承父类属性,__init__是重写父类的方法
		super(B,self).__init__()
		self.name_b = "zhangshan"
	def fun(self):
		print("B")

print(B().name)
print(B().name_b)

xiaoming
zhangshan
[Finished in 1.0s]

>>>调用父类方法一样<<<<
class A:
	def __init__(self):
		self.name = "xiaoming"
	def run(self):
		print("A")


class B(A):
	def __init__(self):
		self.name_b = "zhangshan"
	def fun(self):
		#调用父类方法
		super(B,self).run()
		print("B")

print(B().fun())

A
B
[Finished in 1.0s]

类的内置装饰器

  • @property,把类中的方法当做属性来访问。
class B(A):
	def __init__(self):
		self.name_b = "zhangshan"
	@property
	def run(self):
		print("B")

print(B().run)

B
[Finished in 1.6s]
  • @staticmethod,静态方法装饰器,可以通过类对象访问。
class B(A):
	def __init__(self):
		self.name_b = "zhangshan"
	#这里的方法不需要加self
	@staticmethod
	def run():
		print("B")

#类对象调用方法
print(B.run())

B
[Finished in 1.0s]
  • @classmethod,类的方法装饰器,通过类对象访问,主要区别类参数传入类对象(cls)
class B(A):
	def __init__(self):
		self.name_b = "zhangshan"
	#这里的方法不需要加self,传入cls
	@classmethod
	def run(cls):
		print("B")

#类对象调用方法
print(B.run())

B
[Finished in 1.0s]

__call__方法 ,让类中的方法像函数一样调用,类的装饰器,就是重写这个方法。

class B(A):
	#重写这个call方法,让类加上()就可以被调用。
	def __call__(self,x):
		print("call")
		print(x)

c=B()
c("aaa")

call
aaa
[Finished in 1.3s]
posted @ 2019-01-02 22:20  码农出来卖卖菜  阅读(122)  评论(0编辑  收藏  举报