Python类知识点
Python类知识点
继承顺序
这也是Python2和Python3的一个区别!
在Python2中分为经典类和新式类:
-
经典类,从左到右,深度优先
-
class A: pass
-
-
新式类,从左到右,广度优先
-
# 继承object的是新式类 class A(object): pass
-
在Python3中只有新式类,从左到右,广度优先。以下写法都正确,无论哪种写法,默认都是新式类:
-
写法一
-
class A(object): pass
-
-
写法二
-
class A(): pass
-
-
写法三
-
class A: pass
-
-
Python3多类继承例子:广度优先
-
class P1: def foo(self): print('p1-foo') class P2: def foo(self): print('p2-foo') def bar(self): print('p2-bar') class C1(P1, P2): pass class C2(P1, P2): def bar(self): print('C2-bar') class D(C1, C2): pass d = D() d.foo() # 输出 p1-foo D--C1--C2--P1 d.bar() # 输出 p2-bar D--C2--C2
-
__call__()方法
实例化类对象的时候不会调用__call__()
方法,如果在一个类中定义了__call__()
,那这个类的实例可以被当做一个函数使用,仅此而已!
例子:
class A(object):
def __init__(self, a, b):
self.a = a
self.b = b
def func(self,):
print("a = ", self.a, "b = ", self.b)
def __call__(self, *args, **kwargs):
self.a = args[0]
self.b = args[1]
print("call: a = ", self.a, "b = ", self.b)
obj = A(10, 20)
obj.func()
obj(50, 60) # obj对象被当做函数一样调用
注意,只有在类中定义了__call__()
才能这样用,否则报语法错误。