Pet*_*pie 15 python attributes object
希望避免这样的情况:
>>> class Point:
x = 0
y = 0
>>> a = Point()
>>> a.X = 4 #whoops, typo creates new attribute capital x
Run Code Online (Sandbox Code Playgroud)
我创建了以下用作超类的对象:
class StrictObject(object):
def __setattr__(self, item, value):
if item in dir(self):
object.__setattr__(self, item, value)
else:
raise AttributeError("Attribute " + item + " does not exist.")
Run Code Online (Sandbox Code Playgroud)
虽然这似乎有效,但python 文档说dir():
注意:因为
dir()主要是为了方便在交互式提示中使用而提供,所以它尝试提供一组有趣的名称,而不是尝试提供严格或一致定义的名称集,并且其详细行为可能会在不同版本之间发生变化.例如,当参数是类时,元类属性不在结果列表中.
有没有更好的方法来检查对象是否具有属性?
orl*_*rlp 17
更好的方法.
最常见的方式是"我们都同意成年人".这意味着,您不进行任何检查,并将其留给用户.您所做的任何检查都会使代码的使用灵活性降低.
但是如果你真的想这样做,那么__slots__Python 3.x中默认使用,而Python 2.x中的新式类则是:
默认情况下,旧式和新式类的实例都有一个属性存储字典.这会浪费具有很少实例变量的对象的空间.在创建大量实例时,空间消耗会变得很严重.
可以通过
__slots__在新样式类定义中定义来覆盖默认值.该__slots__声明需要实例变量和储备只够空间的序列中的每个实例来保存每个变量的值.保存空间是因为__dict__没有为每个实例创建空间.如果没有
__dict__变量,则无法为实例分配__slots__定义中未列出的新变量.尝试分配到不公开的变量名称会引发AttributeError.如果需要动态分配新变量,则'__dict__'在__slots__声明中添加字符串序列.
例如:
class Point(object):
__slots__ = ("x", "y")
point = Point()
point.x = 5 # OK
point.y = 1 # OK
point.X = 4 # AttributeError is raised
Run Code Online (Sandbox Code Playgroud)
最后,检查对象是否具有某个属性的正确方法是不使用dir,而是使用内置函数hasattr(object, name).