python--深入类和对象--鸭子类型和抽象基类

深入类和对象

鸭子类型和多态

当看到一只鸟 走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子。
那么这只鸟就可以被称为鸭子。

"""
定义三个类,猫 狗 鸭子
"""
class Cat(object):
	def say(self):
		print("i an a cat")
class Dog(object):
	def say(self):
		print("i an a dog")
classDuck(object):
	def say(self):
		print("i an a duck")

animal = Cat
animal().say()

animal_list = [Cat,Dog,Duck]
for animal in animal_list:
    animal().say()
"""
java
会写一个anamal类
并且指明子类继承某个类并且重写父方法
Aniaml an =Cat()
an.say

python
可以不继承继承其中任何父类
需要做的就是 都要去取say这个父方法

鸭子:
	所有的类,都实现了一个共同的方法,这个方法名字是一样的




#####################################################################
可迭代对象:iterable													
list set 等待,													  
                                                                    
例如extend方法,会调用__iter__ 或者__getitem__                         
a = [1,2]
b = [3,4]
a.enxtend(b)
b不一定是list,只要是可迭代的对象就可以实现,是因为都实现了以上的魔法函数
魔法函数,充分的利用了鸭子类型。
#####################################################################
"""

抽象基类 abc模块

"""

python是动态语言,是没有变量类型的,可以指向任何类型。
动态语言 只有运行的时候,才能知道错误。
动态语言少了编译时,检查错误的环节

python信奉的是鸭子类型,贯穿python整个设计理念。
python的一个类,到底有什么特性或者属于类型
是看里面到底实现了哪些魔法函数

抽象基类:
首先,抽象基类是不能实例化的。

所有继承这个基类的类,必须覆盖 基类 设定好的方法

"""


# 我们去检查某各类是否有某种方法
class Company(object):
    def __init__(self,employee_list):
        self.employee = employee_list
    def __len__(self):
        return len(self.employee)
com = Company(["1","2"])
print(len(com))
# 判断是否有 __len__这个函数  True/False
hasattr(com,"__len__")

"""
java的话,更倾向于判断是否 是指定的类型
isinstance(com,Sized)

python
from collections.ab import Sized
isinstance(com,Sized)
"""

# @abc.abstractmethod
"""
# 我们需要强制某个子类必须实现某个方法

例如	实现了一个web框架,集成cache(未来可以使用redis,cache,memorychache)
需要设计一个抽象基类,指定子类必须实现某些方法
import abc
class Dog(metaclass=abc.ABCMeta):
	@abc.abstractmethod
	def say(self):
		pass
class A(Dog):
    pass
A()
这样如果A 继承Dog类,没有实现say方法的话,是不能实例化的。
TypeError: Can't instantiate abstract class A with abstract methods say
"""

猜你喜欢

转载自blog.csdn.net/sunt2018/article/details/86570014
今日推荐