Python知识整理 (25) 异常
Python的异常语句形式
try: #进入异常管理的范围
<statement>
except <excp1>: #捕获异常1
<statement>
except <excp2>: #捕获异常2
<statement>
except: #捕获所有异常
<statement>
else: [...]
Python知识整理 (24) 类的高级主题
可以继承内置类型, class MyList(list)
变量名压缩(类似C++的name mangling)只发生在class语句内, 只针对开头有两个下划线的变量, 包括属性和方法都适用, 例如, Spam类的属性__X, 会压缩为_Spam__X, 依次来形成伪私有属性
继承树的搜索只发生在使用时候, 如a = obj.member, 而不发生在赋值时, 如obj.member = a
新式类就是继承于内置类object的子类. 新式类在处理多重继承构成的菱形继承树是采用广度遍历搜索的方式, 而老式类采用深度遍历搜索. 新式类的__slots__属性能限定类对象的访问接口, 如__slots__ = ['a','b'], 那么obj.c = 5将报错. 新式类的__getattribute__方法会拦截所有属性访问, 而普通的__getattr__只拦截未定义属性的访问.
静态方法和类方法, 通过staticmethod函数和classmethod函数实现, 例如在普通类中的函数foo, 通过foo = staticmethod(foo), 将foo转换为一个静态方法, 静态方法和类方法的区别在于, 类方法会有额外的cls参数传入, 用于指明调用者的信息, 实现类似self参数的动态行为, 而静态方法仅仅是将函数定义在类中, 多了一层名字空间而已
函数装饰器, 即在定义函数前加上@装饰器名字, 例如可以类中的foo函数定义的上一行加上@staticmethod将foo定义为静态方式, 实际上任何函数均可, 而装饰器实际上就是函数调用, 如定义@a @b @ c def f(), 那么调用f时, 就是调用a(b(c(f())))
Python知识整理 (23) 类代码编写细节-2
__getattr__方法是拦截属性点号运算, 更确切的说, 当通过为定义属性名称且无法通过类继承树找到该名称时, 就会用属性名称来调用这个方法
class empty:
def __getattr__(self, attrname):
if attrname == ‘age’:
return 40
else:
raise [...]
Python知识整理 (22) 类代码编写细节-1
class内包含类属性, 特殊名称方法重载运算符, __init__的构造函数. class内赋值变量名会创建类属性, 而内嵌的def则会创建类方法.位于class定义内的代码, 在class运行时, 会执行.
class MixedNames:
data = ‘spam’
def __init__(self, value):
self.data = value
def display(self):
print self.data, MixedNames.data # MixedNames.data类似于C++中的静态数据成员, 只是对于Python, 此data定义于类MixedNames中.
>>> x = MixedNames(1)
>>> y = MixedNames(2)
>>> x.display(); y.display()
输出:
1 spam
2 spam
class中定义的方法第一个参数总是接受方法调用的隐性主体, 也就是对象, Python会自动把实例方法的调用对应到类方法函数.
x.display()
#等价于
Mixednames.display(x)
调用超类的构造函数
class Super:
def __init__(self, x):
……
class Sub(Super):
def __init__(self,x,y):
Super.__init__(self, x)
<li>类接口技术</li>
<pre lang=’python’>
class Super:
def method(self):
print ‘in Super.method’
del delegate(self):
self.action()
class Inheritance(Super): # 继承
pass
class Replacer(Super): # 重定义
def mdethod(self):
print ‘in Replacer.method’
class Extender(Super): [...]
Python知识整理 (21) 类代码编写基础
代码1: 类外或者对象外增加属性成员
class baseClass:
def __init__(self, value):
self.a = value
a = baseClass("2")
baseClass.bAtt = "1"
b = baseClass("3")
print baseClass.bAtt # 输出1
print baseClass.a # 编译错误
print a.bAtt [...]

