WEB开发网
开发学院软件开发Python 可爱的 Python: Python 之优雅与瑕疵,第 2 部分 阅读

可爱的 Python: Python 之优雅与瑕疵,第 2 部分

 2008-09-30 12:58:25 来源:WEB开发网   
核心提示: slot 方法使用 Python 2.2,我们获得了一种创建 “限制” 类的新机制,可爱的 Python: Python 之优雅与瑕疵,第 2 部分(3),新式类 _slots_ 属性的具体用途并不十分明了,大部分情况下,如果您还创建了一个 .__setattr__

slot 方法

使用 Python 2.2,我们获得了一种创建 “限制” 类的新机制。新式类 _slots_ 属性的具体用途并不十分明了。大部分情况下,Python 文档建议只有对具有大量实例的类进行性能优化时使用 .__slots__ —— 但这绝不是 一种声明属性的方法。但是,后者正是 slot 的作用:它们将创建一个不具备 .__dict__ 属性的类,其中的属性都经过显式命名(然而,在类主体内仍按常规声明方法)。这有一点特别,但是这种方法可以确保在访问属性时调用方法代码:

清单 3. 确保方法执行使用 .__slots__

>>> class Foo2(object):
...   __slots__ = ('just_this')
...   def __getattr__(self, name):
...     return "Value of %s" % name
>>> foo2 = Foo2()
>>> foo2.just_this = "I'm slotted"
>>> foo2.just_this
"I'm slotted"
>>> foo2.something_else = "I'm not slotted"
AttributeError: 'Foo' object has no attribute 'something_else'
>>> foo2.something_else
'Value of something_else'

声明 .__slots__ 可确保只能直接访问您指定的那些属性;所有属性都将经过 .__getattr__() 调用。如果您还创建了一个 .__setattr__() 方法,您可以指定执行一些其他工作,而不是引发一个 AttributeError(但要确保在指定中使用经过 “slot” 处理的值)。例如:

清单 4. 结合使用 .__setattr__ 和 .__slots__

>>> class Foo3(object):
...   __slots__ = ('x')
...   def __setattr__(self, name, val):
...     if name in Foo.__slots__:
...       object.__setattr__(self, name, val)
...   def __getattr__(self, name):
...     return "Value of %s" % name
...
>>> foo3 = Foo3()
>>> foo3.x
'Value of x'
>>> foo3.x = 'x'
>>> foo3.x
'x'
>>> foo3.y
'Value of y'
>>> foo3.y = 'y'  # Doesn't do anything, but doesn't raise exception
>>> foo3.y
'Value of y'

上一页  1 2 3 4 5 6 7  下一页

Tags:可爱 Python Python

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接