1.类里定义的变量和函数等称为这个类的属性
除数据属性(也叫实例变量)外,类实例的另一类属性就是方法。
2.类定义可以写在程序里的任何地方,这一点与函数定义的情况类似。
例如:可以把类定义放在某个函数定义里,或者放在另一个类定义里---------建立了一个局部的类定义,
但通常把类定义写在模块最外层,这样定义的(类)类型在整个模块里都可以用,而且允许其他模块里通过import语句导入和使用。
3.python语言里,所有属性引用(属性访问)都采用圆点记法。
4.每个类对象都有一个默认存在的__doc__数据属性,其值是该类的文档串。即注释内容
对象.__doc__(或类.__doc__)
5.(1)如果在一个类里定义了__init__方法,在创建这个类的实例时,Python解释器就会自动调用这个方法。
(2)__init__第一个参数是self,其总表示当前正在创建的对象。
(3)p = Person('fengyu') 完成的一系列动作:
①创建一个Person类型的对象;
②调用Person类的__init__函数给这个对象的name数据属性(__init__函数中的属性)赋值;
③返回新建的对象
④最后, 赋值语句把这个新对象赋给变量p,作为其约束值。如p的name属性。被约束于字符串'fengyu'。
6.每一个实例对象是一个局部名称空间,其中包含该对象的所有数据属性及其约束值。
如果建立的是空对象(p = Person(),p就是空对象),它就有一个空的名称空间。
7.Python允许在任意方法里给原本没有的(也就是说,初始化函数没建立的)属性赋值,这种赋值将扩大该对象的名称空间。但在实际中这种做法并不多见。
8.一个实例对象是一个独立的数据体,可以像其他对象一样赋给变量作为约束值,或者传进函数处理,或者作为函数的结果返回等。
实例对象也可以作为其他实例对象的属性值(无论是同属一个类的实例对象,或不属于同一个类的实例对象),即组合。
9.类定义的作用域规则:
在类里定义的名字具有局部作用域,在类里和类外使用,需基于类名或对象名的属性引用方式,即类名(对象名).名字
类的局部作用域和函数的局部作用域有不同的规定:
函数:局部名字的作用域自动延伸到内部嵌套的作用域。
类:不自动延伸,所以要用基于类名或对象名的属性引用方式
10.继承的两个作用:
(1)减少重复性代码;
(2)建立一组类(类型)之间的继承关系,利用这种关系有可能更好的组织和构造复杂的程序。
11.内置函数super,把它用在派生类的方法定义里,就是要求从这个类的直接基类开始做属性检索(而不是从这个类本身开始查找)
class A: def func(self): print('in A') class B(A): def func(self): super().func() print('in B') class C(A): def func(self): super().func() print('in C') class D(B,C): def func(self): super().func() print('in D') d = D() d.func()
打印结果:
in A
in C
in B
in D
class A: def func(self): print('in A') class B(A): def func(self): print('in B') super().func() class C(A): def func(self): print('in C') super().func() class D(B,C): def func(self): print('in D') super().func() d = D() d.func()
打印结果:
in D
in B
in C
in A