1.绑定给对象的方法 class Student: def run(self): prtin(self) # 类调用绑定给对象的方法:有几个参数就需要传几个参数 Student.run(123) # 对象调用绑定给对象的方法:会自动将对象当做第一个参数传入 obj1.run() 2.绑定给类的方法 class Student: @classmethod def eat(cls): prtin(cls) # 类调用绑定给类的方法:自动将类当做第一个参数传入 print(Student) # <class '__main__.Student'> Student.eat() # <class '__main__.Student'> # 对象调用绑定给类的方法:也不需要传参 会讲产生该对象的类自动当做第一个参数传入 obj1.eat() # <class '__main__.Student'> # 静态方法 class Student: @staticmethod def speak(a): print(a) # 类调用静态方法:自己传值 Student.speak(123) # 对象调用静态方法:要自己传值 obj1.speak(321)
''' 面向对象三大特性-->继承*、封装、多态 在面向对象中继承用来描述类与类之间的从属关系 eg:类A继承了类B 那么类A就可以使用类B中所有的数据、功能等 继承可以减少代码冗余,提高开发效率,并且支持多继承 对象:数据与功能的结合体 类:多个对象相同数据和功能的结合体 父类:多个类相同数据和功能的结合体 ''' # 继承的语法结构 class A(B): pass # 被继承的类称为-->父类或者基类 继承别人的类称为-->子类或者派生类 # 继承与抽象 抽象:由下往上提取相同特征 继承:由上往下功能传承
# 单继承情况 从对象自己的名称空间中查找,没有择取产生对象的类中查找,如果也没有并且类有父类则到父类中查找 以此往复 对象-->类-->类的父类 # 多继承情况 ''' 新式类:直接或者间接继承了object或者其子类的类 经典类:不继承任何的类 在python2中存在经典类与新式类,而在python3中只有新式类 区别在于是否继承了一个默认的object类 我们在定义类的时候会习惯性的写 class MyClass(object): pass 是为了兼容python2和python3 '''
# 非菱形继承的情况下(对象继承的父类不为其他类的子类) 按照继承时从左往右依次查找 A-->B-->c
:
# 非菱形继承的情况下(对象继承的父类为其他类的子类) 父类中名字的查找顺序就是按照继承时从左往右依次查找 如果多个父类还有分类 那么遵循"深度优先" A-->D-->B-->E-->C-->F
:
# 菱形继承的情况下 父类中名字的查找顺序就是按照继承时从左往右依次查找 如果多个父类还有分类 那么遵循"广度优先" A-->D-->B-->E-->C-->F-->M
:
class Person: def __init__(self,name,age,gender): self.name = name self.age = age self.gender = gender class Teacher(Person): def __init__(self,name,age,gender,level,salary): super().__init__(name,age,gender) # super(Teacher,self).__init__(name,age,gender) 上面是简写 self.level = level self.salary = salary class Student(Person): def __init__(self,name,age,gender,stu_id,class_id): super().__init__(name, age, gender) # super(Teacher,self).__init__(name,age,gender) 上面是简写 self.stu_id = stu_id self.class_id = class_id # 子类继承父类后如果需要扩展可以使用super关键字,这样的子类就叫派生类,本质其实还是子类