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__()才能这样用,否则报语法错误。

posted @ 2019-07-07 18:32  961897  阅读(130)  评论(0编辑  收藏  举报