Python学习-第六章 抽象

抽象

内置函数callable可以判断某个对象是否可调用

>>> import math
>>> x=1
>>> y=math.sqrt
>>> callable(x)
False
>>> callable(y)
True

定义函数用def:

>>> def fibs(num):
...    result=[0,1]
...    for i in range(num-2):
...       result.append(result[-2]+result[-1])
...    return result
...
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

要给函数编写文档,以确保其他人能够理解,可添加注释(以#打头的内容)。还有另一种编写注释的方式,就是添加独立的字符串。放在函数开头的字符串称为文档字符串,将作为函数的一部分存储起来。
函数vars返回看不见的字典,一般而言不应修改vars返回的字典。
多态:可对不同类型的对象执行相同的操作。不同对象对同一方法响应不同的行动。
封装:对外部隐藏有关对象工作原理的细节。
继承:可基于通用类创建出专用类。
多态让你无需知道对象所属的类(对象的类型)就能调用其方法,而封装让你无需知道对象的构造就能使用它。
多态的举例:

class A:
    def fun(self):
        print("我是小A。。。。。")

class B:
    def fun(self):
        print("我是小B。。。。。")
使用了多态但没有使用封装的示例
>>> class OpenObject:
...    def set_name(self,name):
...       self.name=name
...    def get_name(self):      #self是指向对象本身
...       return self.name
...
>>> o=OpenObject()
>>> o.set_name('Sir Lancelot')
>>> o.get_name()
'Sir Lancelot'

在Python3以前的版本中创建类要加上_metaclass_=type
要指定超类,可在class语句中的类名后加上超类名,并将其用圆括号括起。

>>> class Filter:
...    def init(self):
...       self.blocked=[]
...    def filter(self,sequence):
...       return [x for x in sequence if x not in self.blocked]
...
>>> class SPAMFilter(Filter):
...    def init(self):
...       self.blocked=['SPAM']
...
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]
>>> s=SPAMFilter()
>>> s.init()
>>> s.filter(['SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM'])
['eggs', 'bacon']

内置方法issubclass可以确定一个类是否是另一个类的子类。

>>> class Calculator:
...    def calculate(self,expression):
...       self.value=eval(expression)
...
>>> class Talker:
...    def talk(self):
...       print('Hi,my value is',self.value)
...
>>> class TalkingCalculator(Calculator,Talker):
...    pass
...
>>> tc=TalkingCalculator()
>>> tc.calculate('1+2*3')
>>> tc.talk()
Hi,my value is 7

这被称为多重继承,使用多重继承时,注意:如果多个超类以不同的方式实现了同一方法(即有多个同名方法),必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。
多个超类的超类相同时,查找特定方法或属性时访问超类的顺序称为方法解析顺序。
用hasttr可以检查所需的方法是否存在。

>>> hasattr(tc,'talk')
True
>>> hasattr(tc,'fnord')
False

可以使用@abstractmethod来将方法标记为抽象的-在子类中必须实现的方法

猜你喜欢

转载自blog.csdn.net/weixin_43340018/article/details/83242087