面向对象 继承 派生

函数体代码只在调用时执行 ,一但调用产生作用域,存放函数变量

对象:特征与技能的结合体  类:一系列对象相似特征与相似技能的结合体

类:相似特征与技能的结合体

类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__)

 

猜你喜欢

转载自www.cnblogs.com/ekura/p/9317836.html