一。类对象:
1.概念:
类是有层级(树状)的命名空间,实例对象的工厂,产生于class语句
2. 特点;
2.1 class语句创建类,并把类赋值给class后面的变量名
2.2 class作用域为类属性提供命名空间,
2.3 class语句内的赋值语句,创建类属性,这种类属性所有实例共享
def语句创建方法,方法用于处理实例对象
二。实例对象:
1. 概念:
程序处理的实际对象,有独立的命名空间,产生于类的调用,每调用一次,就产生一个新的实例对象
会继承产生该实例对象的类对象的变量名。
2. 特点:
2.1 类的调用,产生实例对象,
2.2 每个实例对象都会继承类的属性,并有自己的独立命名空间
一开始是空的,但是会填写来自继承的类属性。
2.3 类方法的调用,第一个参数是实例自己(self),用于区分不同实例,及定位实例的命名空间,
类方法的调用,会修改该实例命名空间内的数据,当然就不会修改类属性的数值了。
三。第一个例子:
四。类的继承和调用:
五。第二个例子:
继承的搜索会从实例往上走,到子类,到超类,secondclass的display方法覆盖了超类firstclass的display的方法,
这种重新定义,重新取代属性的方式,叫重载
这种定制化,重载是在firstclass外部(重新定义了一个子类)完成的,没有修改firstclass的原代码,之前的x,y实例的display不会受到影响
因此类所支持的后期的扩展性和重用性比函数和模块要好和灵活
六。 类是模块的属性:
把类看成一个变量,模块内对变量的所有操作,基本都适用于类。
因此,类的名字最好别和模块的名字一样,否则容易混淆,python里通常的做法是类名称第一字母大写
七。类支持python的运算符计算:运算符重载
加法,切片,打印,点号运算
1.以双下划线命名的方法是特殊的钩子(运算符重载的标志):这类方法是用来支持运算符计算的方法,而且是有固定的映射规则
例如:__add__对应“+”加法运算
__str__对应“print”的打印命令的调用
如果class语句里面没有定义__add__方法,则直接调用类或实例做加法运算,会报错。
__init__这个不是运算符重载,是比较特殊的一个方法,叫构造函数,主要用于实例的创建,可以立即给实例添加属性
不必等到实例调用方法时,才往空白的实例命名空间里添加属性,你如果想了解某个类里的实例属性,可以去看__init__
2. 当实例出现在内置运算表达式里,会自动调用这些方法,其返回值就是运算表达式的结果(通常是创建了一个新实例)
3. 类有几十种运算符重载的方法,基本能满足python里的常规计算表达式,具体需要了解,可以查手册
4. 运算符重载方式,把类变成了python其他内置数据类型一样的通用,在接口调用等方面,非常便利
八。第三个例子
1. a=ThirdClass('abc'),类的调用,创建实例a,同时传参“abc”给__inti__方法,
如果类里有__init__方法,在类调用,创建实例时,必须按__init__方法的要求传入参数,并在该实例创建时写入内容
没有__init__方法的类,创建实例时,仅仅创建了该实例的命名空间,里面的是空的,等后期方法的调用,才会有写入
2.b=a+'xyz':加号触发了__add__方法,传参规则如下:
3. 需要注意的地方:
以上方法,及实例化,实际是类的一次调用,创建了一个新的实例b,才会有以下的调用:
这点和普通的 8=5+3概念一样,8是新创建出来的常量对象
九。为什么要用运算符重载:
1.数学对象里会大量的使用运算符重载
2.其他情况下比较少用到,相对比较复杂,能不用就不用吧
十。最简单的class:
定义了一个空类
以下动态创建类属性,实例属性
类外动态定义了两个类的属性,为所有实例共享
打印类属性的值
创建实例
显示实例的属性,相同的值说明继承于类属性,是共享的
重新定义了x实例的name属性,覆盖了类属性的name,重载,x有了自己的实例属性
以下动态创建方法:
十一。命名空间对象和字典:
类,实例的属性实际是以字典的模式呈现,类树里只是层次只是连接到不同字典
1.查看类,实例有哪些属性,或者说这个命名空间字典里有哪些键:用__dict__.key属性查看
2.查看实例连接着哪个类,以便于继承该类:__class__
3.查看实例连接着哪个类,以便于继承该类:__bases__
十二。类和字典的关系: