类的成员分析:
- 类和对象都可以是存储成员,成员可以归类所有也可以归对象所有
- 类存储成员时使用的是与类关联的一个对象
- 独享存储成员是存储在当前对象中
- 对象访问一个成员是,如果对象中没有该成员,尝试访问类中的同名成员,有此成员时,就访问此成员
- 类实例-----类存储-------定义类
对象实例------对象存储空间-------定义对象
类实例的构成就是键值对,用A._dict_查看类实例的所有成员
类实例和对象实例中的值是指向关系,用的是同一份数据,类实例的属性和其对象的实例的属性在
不对对象赋值的前提下,指向同一个变量
赋值以后就会发生改变
创建对象的时候类中的成员不会放入对象当中,而是得到一个空对象,没有成员,通过对象对类中成员重新赋值或者通过对象添加成员时,对应成员会保存在对象中,而不会修改成员
关于self
在对象的方法中代表当前对象本身,如果通过对象调用了一个方法,那么该对象会自动传入当前方法的第一个参数中
self不是关键字,只是一个用于接受对象的普通参数,可以用任何一个变量名代替
方法中有self形参的方法成为非绑定类的方法,可以通过对象访问,没有self的是绑定类的方法,只能通过类访问比如:
class Teacher():
name = "wang"
age=19
def say(self):
print("hello")
def sayAgain():
print("hello nice")
print(_class_.name)
t = Teacher()
t.say() ——————————这就属于通过对象访问,非绑定类方法
Teacher.sayAgain() ————————————这就属于通过类访问,
使用类访问绑定类的方法时,如果类方法中需要访问当前类的成员,可以通过_class_成员名访问
鸭子模型
class A():
name = "aaaa"
age = 18
def _init_(self):
self.name = "sss"
self.name= 19
def say(self) :
print(self.name)
print(self.age)
class B():
name="ccc"
age = 20
a=A()
a.say()
A.say(a)
A.say(A)
A.say(B)
对象的参数特性:封装,继承,多态
封装:对对象成员进行访问控制
封装的三个级别
- 公开 public
- 受保护的 protected
- 私有的 private
这不是关键字,判别对象的位置
- 对象内部:
- 对象外部:
- 子类中
私有:私有成员是最高级别的封装,只能在当前类或者对象中访问
在成员面前加两个下划线即可__age就是私有变量
用 类名.dic 查看所有变量
访问私有变量:_类名__变量
protected 受保护的封装 是将对象成员进行一定级别的封装,然后在类中或者子类中都可以进行访问,在外部不可以
封装方法:在成员名称前添加一个下划线
公共的,公开的:public,任何情况都可以使用
继承:继承就是一个类可以获得另一个类中的成员属性和成员方法
继承的作用:减少代码,增加代码的复用功能,同时可以设置类与类直接的关系
继承与被继承的概念:
被继承的类叫父类,也叫基类也叫超类
用于继承的类叫自类,也叫派生类
继承与被继承存在一个is-a关系
语法:class 子类(继承类)
所有的类都继承自object类,即所有的类都是object类的子类
子类一旦继承父类,就可以使用父类除私有成员外的所有内容
子类继承到父类并没有将父类成员完全赋值到子类中,而是通过引用关系访问调用
子类可以定义独有的成员属性和方法
子类父类成员相同优先使用子类
子类如果想扩充父类的方法,可以在定义新方法的同时访问父类成员进行代码重用,可以使用[父类名.父类成员],也可以使用[super().父类成员]的格式来调用
继承变量函数的查找顺序问题:
1.优先查找自己的变量
2.没有则查找父类
3.构造函数如果本类中没有定义,则自动查找调用父类函数
4.如果本类有定义,则不再继续向上查找
构造函数:
实例化的时候第一个被调用
主要工作进行时初始化,因而得名
子类找到了构造函数,则不再查找父类的构造函数,如果没找到就直接查找父类的构造函数