人类(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并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用
优点
查看父类元组
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
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Dog</span><span class="hljs-params">(object)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, name)</span>:</span>
self.name = name
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">eat</span><span class="hljs-params">(self)</span>:</span>
print(<span class="hljs-string">"%s在吃饭"</span>%(self.name))
main.py
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
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
<span class="hljs-keyword">from</span> animal <span class="hljs-keyword">import</span> Animal
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Cat</span><span class="hljs-params">(Animal)</span>:</span>
<span class="hljs-comment"># def __init__(self, name):</span>
<span class="hljs-comment"># self.name = name</span>
<span class="hljs-comment"># def eat(self):</span>
<span class="hljs-comment"># print("%s在吃饭"%(self.name))</span>
<span class="hljs-keyword">pass</span>
main.py
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
定义一个人类,带有feedCat与feedDog方法可以喂猫狗
person.py
class Person(object):
def feedCat(self, cat):
cat.eat()
def feedDog(self, dog):
dog.eat()
main.py
<span class="hljs-keyword">from</span> person <span class="hljs-keyword">import</span> Person
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
per = Person()
cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)
per.feedCat(cat)
per.feedDog(dog)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
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
<span class="hljs-keyword">from</span> person <span class="hljs-keyword">import</span> Person
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog
<span class="hljs-comment">#多态:一种事物的多种形态</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
per = Person()
cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)
<span class="hljs-comment"># per.feedCat(cat)</span>
<span class="hljs-comment"># per.feedDog(dog)</span>
<span class="hljs-comment"># 人要喂养100种动物</span>
per.feedAnimal(cat)
per.feedAnimal(dog)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()