对象的独有功能
class Person: type = '人类' # 公共数据 def __init__(self,name): self.name = name # 添加对象独有的数据 def eat(self): print('%s吃饭中'%self.name) # 是多个对象公共的方法也算多个对象独有的方法 对象来调用就会将对象当做第一个参数传入 def sleep(self): print('%s睡觉中'%self.name) p1 = Person('aa') p1.eat() p1.sleep()
ps:如果在全局中则不是独有的如果在类中则是公共的,python解释器在定义类中的函数默认是绑定给对象的(相当于对象独有的方法)。
动静态方法
1.什么是动态和静态
动态就是绑定给对象的方法直接在类体代码中编写即可,对象调用会自动将对象当做第一个参数传入,类调用则有几个形参就传几个实参;静态方法就是普普通通的函数。
2.代码展示
class Person: type = '动物' def Monkey(self): # 给对象绑定数据,self用于接收对象 print('一只猴子',self) @classmethod # 给类绑定方法,cls用于接收类 def duck(cls): print('一只小黄鸭',cls) @staticmethod # 被@staticmethod修饰的方法,就是静态方法 def chicken(a,b): # 按照普通函数传参方式 print('一只火鸡') stu1 = Person() Person.duck() # 类调用会自动将类当做第一个参数传入 stu1.duck() # 对象调用会自动将产生该对象的类当做第一个参数传入 Person.chicken(1,2)
面向对象三大特征之继承
1.面向对象三大特性
继承 封装 多态
2.继承的含义
继承就是让类继承了另一个类转变为父子关系,子类可以直接访问(调用)父类的静态属性和方法。在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。
3.继承的目的
1.可以减少代码编写
2.减少代码冗余
3.提高重复使用率
4.继承的操作
class 类名(父类名): pass
定义类的时候类名后面加括号
括号内填写你需要继承的类名
括号内可以填写多个父类用逗号隔开
# 2. 定义父类 class Father(): name = "I'm Daddy" # 2. 定义子类,并让子类继承父类Father class Son(Father): pass # 3. 创建子类对象,并调用其继承到的属性和方法 obj = Son() print(obj.name)
继承的本质
1.抽象:
把多个类公共的数据或功能拿出来形成一个基类
2.继承:
从上往下获取每个基类里的资源
3.对象:
数据和功能的结合体
4.类:
多个对象相同的数据和功能的结合体
5.父类:
多个类相同的数据和功能的结合体
数据和方法的查找顺序
1.没有继承父类的情况下名字查找顺序:
对象自身 >>> 类
class Son(): name = 'first' obj = Son() print(obj.name) # 对象自身没有 到产生的类中查找 '''打印结果 first '''
2.单继承的情况下名字查找顺序:
对象自身 >>> 类 >>>继承的父类
class Father(): name = "I'm Daddy" class Son(Father): # name = 'first' pass obj = Son() print(obj.name) # 当类中也没有并且有父类的时候去父类找 '''打印结果 I'm Daddy '''
3.多继承的情况下名字查找顺序:
顺序: A >>> B C >>> D
ps:非菱形继承深度优先(每个分支都走到底 再切换)
顺序:A >>> B C >>> D >>> E
ps:菱形继承广度优先(前面几个分支都不会走最后一个类 最后一个分支才会走)
###当实在搞不清的时候可以用类点mro()方法查看该类产生的对象名字的查找顺序###
经典类与新式类
1.python2解释器
在python2中有经典类和新式类,可以继承object或其子类的类也可以什么都不继承
2.python3解释器
在python3中所有的类默认都会继承object,只有新式类。