P119:self参数正是方法和函数的区别。方法(更专业一点可以成为绑定方法)将它们的第一个参数绑定到所属的实例上,因此无需显式提供该参数。当然也可将特性绑定到一个普通函数上,这样就不会有特殊的self参数了。
让方法变成私有:在名字前面加上双下划线
class Secretive:
def __inaccessible(self):
print("Bet you can't see me")
def accessible(self):
print("The secret message is:")
self.__inaccessible()
s = Secretive()
s.__inaccessible() \\此行报错
s._Secretive.inaccessible
s.accessible()
超类:将其他类名写在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']
f = Filter()
f.init()
f.filter([1,2,3])
s = SPANFilter()
s.init()
s.filter(['SPAM','eggs','bacon','SPAM‘])
这里用提供新定义的方式重写了Filter的init定义。filter方法的定义是从Filter类中继承的。
多个超类,多重继承,若有相同名字的不同方法,先继承的类会覆写后继承的类中的方法。
class Calculator:
def calculate(self,expression):
self.value = eval(expression)
class Talker:
def talk(self):
print("value is",self.value)
class TalkingCalcultor(Calculator,Talker):
pass
tc = TalkingCalcultor()
tc.calculate('1+2*3')
tc.talk()
查看方法是否存在
hasattr(tc,‘talk’)
查看接口是否可调用
hasattr(getattr(tc,‘talk’),‘call’)
捕获多个异常并打印
try:
x=5
y=0
print(x/y)
except (ZeroDivisionError,TypeError) as e:
print(e)