7.1 对象魔法
- 封装:对外部隐藏有关对象工作原理的细节。
- 继承:可基于通用类创建出专业类。
- 多态:可对不同类型的对象中执行相同的操作。
7.2 类
7.2.1 创建自定义类
_metaclass_ = type
class Person:
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def greet(self):
print("Hello,world!I'm {}.".format(self.name))
7.2.2 隐藏
默认情况下,可从外部访问对象的属性。
>>> c.name
'Sir lancelot'
>>> c.name = 'Sir Gumby'
>>> c.get_name()
'Sir Gumby'
7.2.3 超类
要指定超类,可在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): # SPAMFilter是Filter的子类
def init(self): # 重写超类Filter的方法init
self.blocked = ['SPAM']
7.2.4 多个超类
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
注意:如果多个超类以不同的方式实现了同一个方法,必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。
7.2.5 接口
接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类继承后,由 类B去实现其中的某个功能或全部功能。
- 方法一:用抽象类和抽象函数实现方法
#抽象类加抽象方法就等于面向对象编程中的接口
from abc import ABCMeta,abstractmethod
class interface(object):
__metaclass__ = ABCMeta #指定这是一个抽象类
@abstractmethod #抽象方法
def Lee(self):
pass
def Marlon(self):
pass
class RelalizeInterfaceLee(interface):#必须实现interface中的所有函数,否则会编译错误
def __init__(self):
print '这是接口interface的实现'
def Lee(self):
print '实现Lee功能'
def Marlon(self):
pass
class RelalizeInterfaceMarlon(interface): #必须实现interface中的所有函数,否则会编译错误
def __init__(self):
print '这是接口interface的实现'
def Lee(self):
pass
def Marlon(self):
print "实现Marlon功能"
- 方法二:用普通类定义接口
class interface(object): #假设这就是一个接口,接口名可以随意定义,所有的子类不需要实现在这个类中的函数
def Lee(self):,
pass
def Marlon(self):
pass
class Realaize_interface(interface):
def __init__(self):
pass
def Lee(self):
print "实现接口中的Lee函数"
class Realaize_interface2(interface):
def __init__(self):
pass
def Marlon(self):
print "实现接口中的Marlon函数"
obj=Realaize_interface()
obj.Lee()
obj=Realaize_interface2()
obj.Marlon()