抽象
内置函数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来将方法标记为抽象的-在子类中必须实现的方法