3.1 子类化内建函数
distinctdict.py:python中dict的子类。这个类与dict不同的是它不允许为一个key多次赋值。
class DistinctError(Exception):
pass
class DistinctDict(dict):
def __setitem__(self, key, value):
try:
value_index = self.values().index(value)
# keys() and values() will return
# corresponding lists
# as long as the dict is not changed
# between the two calls
# otherwise the dict type does not guaranteen the ordering.
existing_key = self.keys()[value_index]
if existing_key != key:
raise DistinctError("This value already exists for '%s'" % str(self[existing_key]))
except ValueError:
pass
super(DistinctDict, self).__setitem__(key, value)
3.2 访问超类中的方法
super是一个内建类型,用来访问某个对象的超类中的特性(attribute)。my_super.py
class Mama(object):
def says(self):
print 'do your homework'
class Sister(Mama):
def says(self):
super(Sister, self).says()
print 'and clean your bedroom'
Method Resolution Order (MRO): my_mro.py
- L[MyClass(Base1,Base2)]=MyClass+merge(L[Base1],L[Base2],Base1,Base2)
- L[MyClass]是MyClass类的线性化,而merge是合并多个线性化结果的具体算法。
- C的线性化是C加上父类的线性化和父类列表的合并的总和。
- merge算法负责删除重复项并保持正确的顺序。
- 类的mro特性(只读)用来存储线性化计算的结果
class BaseBase(object):
pass
class Base1(BaseBase):
pass
class Base2(BaseBase):
pass
class MyClass(Base1, Base2):
pass
def L(klass):
return [k.__name__ for k in klass.__mro__]
print L(MyClass) # ['MyClass', 'Base1', 'Base2', 'BaseBase', 'object']
3.4 描述符和属性
描述符是Python中复杂特性访问的基础。它们在内部使用,以实现属性、类、静态方法和super类等。它们是定义另一个类特性可能的访问方式的类。换句话说,一个类可以委托另一个类来管理其特性。
描述符类
描述符类基于三个必须实现的特殊方法:
- __set__ 在任何特性被设置的时候调用(setter)
- __get__ 在任何特性被读取时调用(getter)
- __delete__在特性上请求del时调用
这些方法将在__dict__特性之前被调用。一个使用数据描述符的实例:upper_string.py
class UpperString(object):
def __init__(self):
self._value = ''
def __get__(self, instance, klass):
return self._value
def __set__(self, instance, value):
self._value = value.upper()
class MyClass