面向对象
一个类可以没有__init__ 方法
在没有__init__的情况下,实例化经历了哪些步骤?
1.创建一个空间给对象
2.将这个空间的地址返回
类中的代码是在实例化之前执行的
在实例化的过程中,开辟了属于对象的一块空间
对象可以查看类的静态属性,但是不能修改
并且一旦修改,就不能取到类当中的内容了(除非手动删除这个修改的属性)
所有的静态属性的修改,都应该由类名来完成,而不应该使用对象名来完成
如果静态变量是一个不可变数据类型,那么只要对象修改这个数据,就相当于在对象的空间中新建
如果静态变量是一个可变数据类型,那么对象修改这个容器中的元素,相当于修改类的空间中的元素
如果静态变量是一个可变数据类型,那么对象直接对这个变量重新赋值,相当于修改对象自己空间中的元素
结论
只要是静态变量,就用类名去修改,永远修改成功,并且所有的对象都共享这个变量
总结
对象的命名空间:类指针对象的所有属性
类的命名空间:方法和(静态属性字段)
对象在寻找名字的时候:先找对象自己内存空间中的,找不到就去类的命名空间中寻找
类中的名字是什么时候写入内存的
代码从上到下执行的时候就已经写入的.一定是在实例化之前
静态变量:尽量用类名去操作
什么是组合
一个类对象的属性是另外一个类的对象
面向对象的三大特征
所有的面向对象的语言 三大特征 通用的
继承:为了解决类与类之间代码重复的问题
类的继承的语法
单继承
在定义类的时候加(),括号里面写的就是继承的类
class A:pass
class B(A):pass
A类:父类 基类 超类
B类:子类 派生类
多继承(Python支持 java不支持)
class C:pass
class D:pass
class E(C,D):pass
E继承了CD
子类可以继承父类的方法和属性
继承
子类调用方法,如果子类自己有,用自己的,用了自己的就不用父类的
如果子类自己没有才调用父类的
如果子类有个性化的父类没有的方法,可以单独定义在子类中
只有子类能够使用父类中的方法,父类不可以使用子类中的方法
当某一个方法,父类和子类都拥有的时候,那么在子类的方法中,调用父类的同名方法就会用到
1 父类名.方法名(self,..)
2 super().方法()
class Animal: def __init__(self,name,kind,language): self.name=name self.kind=kind self.language=language def eat(self): print('%s is eat'%self.name) def drink(self): print('%s is drink'%self.name) def yell(self): print('%s is yell '%self.name) def sleep(self): print('%s is sleep'%self.name) class Cat(Animal): def climb(self): print('%s can climb'%self.name) def sleep(self): Animal.sleep(self) print('团着睡') class Dog(Animal): def yell(self): super().yell() print('大声叫') def sleep(self): super().sleep() print('站着睡') xiaohua=Cat('小花','金吉拉','喵喵') xiaohei=Dog('小黑','土狗','旺旺') xiaohua.sleep() xiaohei.sleep() 小花 is sleep 团着睡 小黑 is sleep 站着睡