Python3 从零单排19_组合&多态

  组合 :对象1的属性是对象2,对象1就拥有了对象2的数据和函数属性,这就是组合。
# A类型和B类型没有共性,不可以继承,但是A有B的特性,比如A是人,B是家,A和B没有继承关系,但是人有家,A有B的关系,那么就可以把B的属性都给A用
class people:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def say_hi(self):
        print("hi my name is %s"%self.name)


class home:
    def __init__(self,adress,area,height):
        self.adress = adress
        self.area = area
        self.heaight = height

    def home_info(self):
        print("地址:%s,面积:%s"%(self.adress,self.area))


xg = people("晓钢",18)
hourse = home("地球",1000,10)
xg.hourse = hourse
xg.hourse.home_info()  #地址:地球,面积:1000

  抽象类:抽取一些类的共性作为一个类,比如水果类,人类。抽象类能被继承,但是不能被实例化。
  当函数属性用装饰器abc.abstractmethod装饰的时候,子类必须按照抽象类的定义实现这个固定的函数属性,否则报错。
import abc #需要用到abc这个模块来定义抽象类


class animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod  #abc.abstractmethod 装饰后,该类的所有子类必须含有该方法才不会报错
    def run(self):
        print("people is running!")

    def sleep(self):
        pass

class people(animal):
    def run(self):  #必须定义run方法才可以,否则报错
        pass

  

多态:同一类事物的多种形态
import abc


class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod  
    def talk(self): # animal的所有子类都必须实现talk方法,否则报错
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print('say hello')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say aoao')

class Cat(Animal): #动物的形态之三:猫
    def talk(self):
        print('say miamiao')

#多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象方法  从而扩展性高
peo1=People()
dog1=Dog()
pig1=Pig()
cat1=Cat()

# peo1.talk()
# dog1.talk()
# pig1.talk()

def func(animal):
    animal.talk()
    
func(peo1)
func(pig1)
func(dog1)
func(cat1)

 

鸭子类型  不同类定义的函数或者数据属性名字相同,不同对象在调用这些属性时,看上去都是一样的属性,实现功能也一样,但内部代码逻辑并不一样。
class Disk:
    def read(self):
        print('disk read')

    def write(self):
        print('disk write')


class Text:
    def read(self):
        print('text read')

    def write(self):
        print('text write')

# f=open(...)
# f.read()
# f.write()

disk=Disk()
text=Text()

disk.read()
disk.write()

text.read()
text.write()

  

序列类型是典型的鸭子类型:列表list,元祖tuple,字符串str
l=list([1,2,3])
t=tuple(('a','b'))
s=str('hello')
#
# # print(l.__len__())
# # print(t.__len__())
# # print(s.__len__())
#
# # def len(obj):
# #     return obj.__len__()

print(len(l))
print(len(t))
print(len(s))

 

 
 
 
 
 
 
posted @ 2018-12-19 17:18  毛斯钢  阅读(169)  评论(0编辑  收藏  举报