1.使用类名调用类变量,不要使用实例引用调用类变量。
原因:python允许类变量和实例变量重名。当使用实例引用调用类变量时,可能会创造一个实例变量,而不是调用类变量。
class Test: class_var = 1 def __init__(self): pass def fun(self): self.class_var = 0 '''测试用例1''' test = Test() test.fun() # --->两个测试用例的差别之处 print(test.class_var) # 0 '''测试用例2''' test = Test() print(test.class_var) # 1
2. python创建一个实例时,只能运行继承树最底层的__init__(),python不会自动运行所有高层基类的构造函数。
因为构造函数通常会准备一些必要的准备工作,所以派生类的构造函数必须调用基类的构造函数,除非基类没有构造函数。
3.class是可执行语句,直到python抵达并运行定义的class语句后,类才存在。执行class时,会产生一个类对象,并把其引用存储到前面所使用的(类)名称中。
4.调用实例方法的两种形式:
instance.method(args...)
class.method(instance,args...)
方法的第一位参数总是接受方法调用的隐含主题,也就是当前的实例对象。
5.你可以在一个类中编写多个__init__方法,但是只有最后一个被使用。
6.继承
继承树,派生类可以定制和扩展属性与方法。当调用属性和方法时,会自底向上搜索继承树,找到属性或方法后便停止向上搜索。
class Super: def A(self): self.action() self.B() print ('''i am super's method A.''') def B(self): print ('''i am super's method B.''') class Extender(Super): def B(self): print ('''i am extender's method B.''') def action(self): print('''i am extender's action.''') e = Extender() e.A()
i am extender's action. i am extender's method B. i am super's method A.