如何理解类?
类可作为一个大类的统称,在这个大类之中定义一些该大类包含的子类所共有的属性(如动物类,可包含其子类如猫,狗等的共同属性,如 吃喝拉撒等).
为什么需要类?
当同样的属性需要被反复使用时,类的定义可以很大程度上节省空间及是代码更加简洁(因为相同的属性全都定义在一个类指针了,那么其他的类要使用时就不必再次进行编写,直接从大类中引用即可)
1类的形式:
调用类时: 具体实例名称=类名() 实例名称.方法() 即可调用该类的方法.
此处的方法就是 eat函数 eat函数执行结果是 "整天吃"故输出是整天吃.类的实例在使用时实际上是使用了类中定义好的方法,定义的方法是什么输出你引用时就是什么输出,若方法中没有输出,则在外部自己添加print()函数输出一般输出 类名 +object at+地址,故有__str__方法.
2 类中的方法
类中常见的有__init__方法(也被称为魔术方法 以双下划线开头结尾的方法,是python内置的方法)
除此之外也可以自己定义方法(跟定义函数一致)
__init__中的参数用于自定义输入(通常跟随__str__方法,此方法用于自定义输出格式)
3类的继承
一个类继承另一个类,A继承B ,A称为子类(派生类),B称为父类(超类),(注:object是最大的超类,可理解为他是最老的祖宗 这里也能解释上面没用str方法的输出会有object)
继承的作用:子类一旦继承父类,就能使用父类中定义的公共方法,同时也能根据需求在父类方法的基础上进行扩展
格式 : clas 子类名(父类名1,父类名2,...):
子类可以继承一个父类,也可继承多个父类,方法一致
子类可以继承父类,也可以继承父类所继承的父类(粗浅理解为 孩子可继承爸爸的,再通过爸爸去继承爷爷的)
多继承中有父类有相同名称的方法怎么办?
a是Aa1的实例,而Aa1又同时继承A1 A2,在调用相同名称方法的时候遵循"先找到谁就用谁"
先在A1中找到就用了A1中的方法.
即先在Aa1中找该方法,找不到再按照__mro__函数显示的顺序进行寻找
(住:不同编译器查找顺序可能不同,有些是 亲爹-亲爷爷-干爹-干爷爷 而有些则是亲爹-干爹-亲爷爷-干爷爷,此处稍作了解即可)
4 类属性与实例属性
类属性定义:定义在类方法内 (class之内),实例方法之外(def之外)的方法 可以被类对象和实例对象共同访问.
实例属性定义:定义在实例方法之内的属性,只能被实例对象引用 (注:若是用实例对象调用类属性,先在实例方法中找,找不到再去类方法中找,二者均不存在会报错!)
能否通过实例对象对类属性进行修改? 不可!
能否通过类对象对类属性进行修改? 可以!