python- 类,对象 --》多态,封装,继承
self:对象自身
成员方法可以访问他们要对其特性进行操作的对象本身
私有化:其他程序员是不会知道你的对象内部的具体操作
例如:ClosedObject 可能会在其他对象改变自己的名字时,给一些管理员发邮件。这个操作应该时 setName 方法的一部分
但是如果直接使用 c.name 设定名字,是什么都不会发生的。我们要避免这样的事情发生,应该使用 private 特性
即外部对象无法访问,但 getName 和 setName 等访问器(accessor)
注:python 并不支持私有方式,
类名.成员与对象.成员是两个毫不相干的,互不干扰的空间
私有方法:方法名前有两个下划线,或者只有一个下划线开头的方法
两个下划线的名字 都被 “翻译”成前面加上单下划线和类名的形式
如:#s._Secretive_inaccessible()
但在 python3 中,无法访问 s._Secretive_inaccessible()
会报错:AttributeError: 'Secretive' object has no attribute '_Secretive_inaccessible'
多重继承:multiple inheritance
除非特别熟悉多重继承,否则应该尽量避免使用,应为有些时候会出现不可预测的麻烦
特性:先继承的类中的方法会重写后继承的类中的方法
~~~
class Person:
def setName(self,name):
self.name = name
def getName(self):
return self.name
def greet(self):
print("Hello,world! I'm %s." % self.name)
foo =Person()
bar = Person()
foo.setName('Luke Skywalker')
bar.setName('Anakin Skywalker')
foo.greet()
bar.greet()
class MemberCounter:
members =0
def init(self):
MemberCounter.members+=1
m1 =MemberCounter()
m1.init()
print(MemberCounter.members)
m2=MemberCounter()
m2.init()
print(MemberCounter.members)
print('m1.member:',m1.members,'m2.members',m2.members)
m1.members =3
m2.members =8
print('m1.member:',m1.members,'m2.members',m2.members)
m1.init()
print(MemberCounter.members)
m2.init()
print(MemberCounter.members)
print('m1.member:',m1.members,'m2.members',m2.members)
print('id:',id(MemberCounter.members))
print('id:',id(m1.members))
print('id:',id(m2.members))
print('------------------------------------------')
class Secretive:
def __inaccessible(self):
print('Bet oyu can\'t see me..')
def accessible(self):
print('The secret message is:')
self.__inaccessible()
s = Secretive()
#s.__inaccessible() #'Secretive' object has no attribute '__inaccessible'
#方法__inaccessible() 是私有化方法
#s._Secretive_inaccessible() AttributeError: 'Secretive' object has no attribute '_Secretive_inaccessible'
s.accessible()
#类的继承
class Filter:
def init(self):
self.blocked=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
class SAMPFilter(Filter):
def init(self):
self.blocked=['SPAM']
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
f= Filter()
f.init()
print(f.filter([1,2,3,4]))
s = SAMPFilter()
#print(s.filter(['SPAM#',2,3,4])) #这里提示 has no attribute ,为什么?因为没有先执行 init 方法
s.init()
print(s.filter(['SPAM',2,3,4]))
#方法 issubclass 函数
# 特性:__bases__ 获取类的基类
# __class__ 获取当前对象的类名
print(issubclass(Filter,SAMPFilter))
print(issubclass(SAMPFilter,Filter)) #True 后面是前面的基类
print(SAMPFilter.__base__)
print(s.__class__)
评论