面向对象 继承 派生
Posted ekura
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象 继承 派生相关的知识,希望对你有一定的参考价值。
函数体代码只在调用时执行 ,一但调用产生作用域,存放函数变量
对象:特征与技能的结合体 类:一系列对象相似特征与相似技能的结合体
类:相似特征与技能的结合体
类class 类名首字母大写,类在定义阶段内部代码就会执行,产生名称空间(类名.__dict__:各属性名值对的字典),内部定义的变量:数据属性 类内部定义的函数:函数属性
class.属性名来访问属性
class.新属性名 = ‘**‘增加了一个属性
del class.属性名 删除属性 stu1.属性名=‘’更改一个属性
类名()实例化得到一个对象
__init__为对象定制对象自己独有的特征
加上init后实例化的步骤:产生一个空对象stu1;触发类.__init__(stu1,参数) 对象stu1是个名称空间,stu1.__dict__能够查看stu1的名称空间字典
对象stu1的增删改查与class的一样
类的数据属性是所有对象共有的,指向了同一个内存地址
类的函数属性是绑定给对象的,绑定到不同的对象是不同的绑定方法,绑定到的内存地址是不一样的,对象调用绑定方法时默认把对象本身当做第一个参数self传入
- 站的角度不同,定义出的类是截然不同的;
- 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中有时需要拆分成部门类,业务类等;
- 有时为了编程需求,程序中也可能会定义现实中不存在的类,比如策略类,现实中并不存在,但是在程序中却是一个很常见的类。
python中一切皆对象,在python3中统一了类与类型的概念(定义数字 int()类产生一个数字对象)
使用类可以:将数据与专门操作该数据的功能整合到一起
定义学生类,并计算产生了多少个学生对象:
class Student():
school = "luffycity" #共同属性 数据属性
c = 0
def __init__(self,name,age,sex): #定义对象独有属性
self.name = name
self.age = age
self.sex = sex
# self.c += 1 # 去类里找 但是只每个对象独有的 互不影响 也没有更改类的c值
Student.c += 1 #更改了共有属性
def learn(self): #函数属性
print(‘%s is learning‘%(self.name))
stu1 = Student(‘a‘,22,‘f‘)
stu2 = Student(‘b‘,21,‘m‘) #实例化对象 stu1 stu2
print(stu1.__dict__)
print(stu2.__dict__) #打印出对象stu1 stu2的命名空间 {‘name‘: ‘b‘, ‘age‘: 21, ‘sex‘: ‘m‘} 私有属性
print(Student.c) #类的属性 共有
print(stu1.c)
print(stu2.c) # 共有属性需要用对象去掉用查看
print(stu1.school)
print(stu2.school)
stu1.learn()
stu2.learn() #共有函数属性
Student.learn(stu1) # = stu1.learn 对象调用时默认把自己当做self参数传进去
继承:class1.__bases__查看class1有哪些父类
对象查找属性:找自己- 找类-找父类-找父类的父类。。。不去全局找
类与类之间 什么是什么 的关系
派生:
当子类中派生出自己的属性时以优先以自己的属性、所在的类为主
属性查找方式:对象最先,对象本身没有时子类会先于父类被检查;
多个父类会根据它们在列表中的顺序被检查;
如果对下一个类存在两个合法的选择,选择第一个父类
python2:新式类:继承object的类以及他的子类
经典类:没有继承object的类以及他的子类 查找属性顺序:深度优先
python3:新式类 python3没有继承的类默认都继承object类 查找属性顺序:广度优先 按照__mro__列表的顺序查找
经典类:
新式类:
在子类派生出新方法中重用父类的方法:
1:指名道姓 父类名.方法名() 不依赖继承
2:super(自己类名,self).父类方法名 依赖于继承关系 super(自己类名,self)得到特殊的对象 可以调用父类属性,对象绑定方法时对象会默认把自己传到第一个参数self
super(Garen,self).attack(enemy) python3中可以直接用super().父类方法
super依照子类的__mro__列表去查找父类属性 参照的是基于子类的mro列表
class A:
def f1(self):
print("from A")
super(A,self).f1() # 虽然A没有父类 但程序基于的是类C的mro列表(C,A,B,object)去查找,所以A里调用super其实调用的是类B
class B:
def f1(self):
print("from B")
class C(A,B):
pass
c = C()
c.f1()
print(C.__mro__)
以上是关于面向对象 继承 派生的主要内容,如果未能解决你的问题,请参考以下文章