类
类
类的继承
- 新式类,广度优先,先在水平方向查找,然后再向上查找。
- 经典类,深度优先。
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]
得到了不该得到的得到,就会失去不该失去的失去!
忍受别人不能忍受的忍受,就能享受别人不能享受的享受!