共计 4903 个字符,预计需要花费 13 分钟才能阅读完成。
一、继承的概念
二、单继承的实现
-
人类(person.py)
-
class Person(object): def __init__(self, name, age, sex, money): self.name = name self.age = age self.sex = sex # 私有属性 self.__money = money @property def money(self): return self.__money @money.setter def money(self, value): self.__money = value def run(self): print("---------run")
-
学生类(student.py)
from person import Person class Student(Person): def __init__(self, name, age, sex, money, stuId): # 调用父类中的__init__函数 super().__init__(name, age, sex, money) # 增加独有属性 self.stuId = stuId # 增加独有的方法 def say(self): print("---------say") # 重写 run 方法 def run(self): print("student run") super().run()# 执行父类中的方法 (原功能)
-
工人类(worker.py)
from person import Person class Worker(Person): def __init__(self, name, age, sex, money, gl): super().__init__(name, age, sex, money) self.gl = gl def talk(self): print("---------talk")
-
主文件(main.py)
from student import Student from worker import Worker def main(): stu1 = Student("dily", 30, "男", 100, 1) wor1 = Worker("wangbw", 40, "男", 200, 20) # 方法的使用原理:当对象调用方法时,首先现在本类中查找同名方法,找到了就用,找不到去直接父类中查找,父类中有就用,没有的话再去上一级父类中查找,直到找到 object 中截止,在哪里找到就用哪里方法。如果没有没有找到那么就报错说明没有该方法 stu1.run() wor1.run() stu1.say() wor1.talk() # 私有属性可以被继承 print("---------", stu1.money) if __name__ == "__main__": main()
三、重写
目的:将继承的方法重写一遍,在原有的功能基础上可以添加一些新的功能
class Person(object):
# 重写:将继承的方法重写一遍,在原有的功能基础上可以添加一些新的功能
def __init__(self, name, age):
self.name = name
self.age = age
# 在用户调用 print 打印该类型的对象时
# 显示给用户的
def __str__(self):
return "1-name:%s,age:%d"%(self.name, self.age)
# 是给机器用的,在 python 解释器里直接敲对象时被调用
def __repr__(self):
return "2-name:%s,age:%d" % (self.name, self.age)
per = Person("liudh", 55)
print(per)
# print(per.name, per.age)
四、多继承的实现
-
加法类(add.py)
class Add(object): def __init__(self, m, n, a): self.m = m self.n = n self.a = a def sum(self, x, y): return x + y def say(self): print("sunck is a good man")
-
减法类(sub.py)
class Sub(object): def __init__(self, m, n, b): self.m = m self.n = n self.b = b def sub(self, x, y): return x - y def say(self): print("sunck is a nice man")
-
计算器类(calculate.py)
from add import Add from sub import Sub # 多继承:在小括号中依次写入父类 class Calculate(Add, Sub): def __init__(self, m, n, a, b): Add.__init__(self, m, n ,a) Sub.__init__(self, m, n ,b)
-
主文件(main.py)
from calculate import Calculate def main(): c = Calculate(1,2,3,4) print(c.m) print(c.n) print(c.a) print(c.b) # 父类中的方法名相同,默认调用的是括号中排名靠前的父类中的方法 c.say() if __name__ == "__main__": main()
五、Mixin
-
概念
Mixin 编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常 mixin 并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用
-
优点
- 以在不修改任何源代码的情况下,对已有类进行扩展
- 可以保证组件的划分
- 可以根据需要,使用已有的功能进行组合,来实现“新”类
- 很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类
-
查看父类元组
class Person(object): def __init__(self, name, age): self.name = name self.age = age def say(self): print("%s is a good man"%(self.name)) class A(object): pass class Worker(Person, A): def __init__(self, name, age, gl): super().__init__(name, age) self.gl = gl # 是元组类型,里面的每个元素是该类的父类 print(Worker.__bases__)
-
使用 Mixin 类动态添加父类
# 定义一个 Mixin 类,一般省略 object class FixMixin(): def fixPhone(self): print("修手机") def fixComputer(self): print("修电脑") class Person(object): def __init__(self, name, age): self.name = name self.age = age def say(self): print("%s is a good man"%(self.name)) class Student(Person): def __init__(self, name, age, stuId): super().__init__(name, age) self.stuId = stuId # 给 pyClass 动态添加父类 pyMixinClass,flag 为真时可以明确 pyMixinClass 不在 pyClass.__bases__中,否则需要 mixin 函数自己去判断 def mixin(pyClass, pyMixinClass, flag=0): if flag: pyClass.__bases__ += (pyMixinClass,) if pyMixinClass not in pyClass.__bases__: pyClass.__bases__ += (pyMixinClass,) # 将 FixMixin 类动态设置为 Student 的父类 mixin(Student, FixMixin, 0) stu = Student("dily", 18, 1) stu.say() stu.fixPhone()
六、多态
概念:一种事物的多种形态
终极目标:人可以喂任何一种动物
-
定义出两个类 (猫、狗),分别带有 name 属性与 eat 方法
cat.py
class Cat(object): def __init__(self, name): self.name = name def eat(self): print("%s 在吃饭"%(self.name))
dog.py
class Dog(object): def __init__(self, name): self.name = name def eat(self): print("%s 在吃饭"%(self.name))
main.py
from cat import Cat from dog import Dog def main(): cat = Cat("lele", 8) dog = Dog("huanhuan", 4) if __name__ == "__main__": main()
-
再添加 100 种动物,也都是有 name 属性与 eat 方法
定义一个 Animal 类,带有 name 属性与 eat 方法,让猫、狗等动物都继承自 Animal 类
animal.py
class Animal(object): def __init__(self, name): self.name = name def eat(self): print("%s 在吃饭"%(self.name))
dog.py
from animal import Animal class Dog(Animal): # def __init__(self, name): # self.name = name # def eat(self): # print("%s 在吃饭"%(self.name)) pass
cat.py
from animal import Animal class Cat(Animal): # def __init__(self, name): # self.name = name # def eat(self): # print("%s 在吃饭"%(self.name)) pass
main.py
from cat import Cat from dog import Dog def main(): cat = Cat("lele", 8) dog = Dog("huanhuan", 4) if __name__ == "__main__": main()
-
定义一个人类,带有 feedCat 与 feedDog 方法可以喂猫狗
person.py
class Person(object): def feedCat(self, cat): cat.eat() def feedDog(self, dog): dog.eat()
main.py
from person import Person from cat import Cat from dog import Dog def main(): per = Person() cat = Cat("lele", 8) dog = Dog("huanhuan", 4) per.feedCat(cat) per.feedDog(dog) if __name__ == "__main__": main()
-
人要喂 100 种动物,难道要写 100 个 feedXXX 吗?
person.py
class Person(object): # def feedCat(self, cat): # cat.eat() # def feedDog(self, dog): # dog.eat() def feedAnimal(self, ani): ani.eat()
main.py
from person import Person from cat import Cat from dog import Dog # 多态:一种事物的多种形态 def main(): per = Person() cat = Cat("lele", 8) dog = Dog("huanhuan", 4) # per.feedCat(cat) # per.feedDog(dog) # 人要喂养 100 种动物 per.feedAnimal(cat) per.feedAnimal(dog) if __name__ == "__main__": main()
正文完
星哥玩云-微信公众号