Python高级编程-3语法最佳实践——类级

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值