0

是否可以创建一个在实例化时永远不会抛出 AttributeError 而是调用自己的方法来定义属性的类?

目前,我可以这样做:

class O: pass

o = O()

o.car = O()
o.car.type = "family"
o.car.color = "red"

o.car.trail = O()
o.car.trail.color = "yellow"

o.house = O()
o.house.size = "small"
o.house.number = 87

我正在尝试从一组通用对象中创建任意层次结构。唯一的目的是保存任意数据,即不需要定义class Car:or class House:

现在我想知道是否可以定义一个每次找不到属性时都会调用的“神奇”方法:

class O:
   def __magically_define_attribute__(self, name):
       setattr(self, name, O())

所以我可以省略所有的O()s 并简单地做:

o = O()

o.car.type = "family"
o.car.color = "red"
o.car.trail.color = "yellow"
o.house.size = "small"
o.house.number = 87

那么有可能吗?如果没有,是否有具体原因?

(是的,它是关于数据的,所以我知道我可能应该在这里使用字典层次结构,我仍然想知道这是否可能,因为与 dict 语法相比,点语法显然更容易读写。)

4

2 回答 2

3

你的意思是这样的吗?

class Obj(object):
    def __getattr__(self,x):
        setattr(self,x,Obj())
        return getattr(self,x)

o = Obj()
o.car.type = "family"
o.car.color = "red"

print o.car.color
于 2013-05-20T15:08:33.703 回答
1

__getattr__方法看起来应该可以满足您的需求。它在什么时候被调用

属性查找未在通常的位置找到该属性(即它不是实例属性,也不是在 self 的类树中找到)。name 是属性名

于 2013-05-20T15:08:23.173 回答