函数体代码只在调用时执行 ,一但调用产生作用域,存放函数变量
对象:特征与技能的结合体 类:一系列对象相似特征与相似技能的结合体
类:相似特征与技能的结合体
类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 stu2print(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其实调用的是类Bclass B: def f1(self): print("from B")class C(A,B): pass c = C()c.f1()print(C.__mro__)
原文地址:https://www.cnblogs.com/ekura/p/9317836.html