如何知道是否将一个类设置为一个值

时间:2019-03-16 15:51:52

标签: python python-3.x

所以,我编写了一个小程序,基本上可以做到这一点:

class Prop(object):
    def __init__(self, name, val):
        self.Name = name;
        self.Value = val;

class Obj(object):
    def __init__(self, prop):
        self._props = [prop];

    def __getattribute__(self, name):
        if name != "_props":
            f = None;

            for p in self._props:
                if p.Name == name:
                    f = p;

            return f;
        else:
            return object.__getattribute__(self, name);

cl = Prop("Name", "foo");
o = Obj(cl);

print(o.Name.Value); # by changing "f = p;" to "f = p[1]", I would simply do o.Name instead of o.Name.Value

这将返回对象的名称,没有问题。

当我想设置值但没有实际执行.Value时出现问题

我之所以想要实现这一目标,有很多原因,例如使对象的编辑更简单等。

所以,如果我做了类似的事情

o.Name = "boo";

我将无法做,因为我必须做类似的事情

o.Name.Value = "boo"; 

即使我改变了这件作品

            for p in self._props:
                if p.Name == name:
                    f = p;

类似

            for p in self._props:
                if p.Name == name:
                    f = p.Value;

我仍然无法做类似的事情

o.Name = "";

我可以使用任何下划线(双_)功能吗?还是有什么解决办法?

如果是这样,我将如何在此系统上实现它?

2 个答案:

答案 0 :(得分:1)

一种方法是使用__setattr__

class Obj(object):
    ...

    def __setattr__(self, name, value):
        if name != "_props":
            for p in self._props:
                if p.Name == name:
                    p.Value = value
        else:
            object.__setattr__(self, name, value)            

cl = Prop("Name", "foo");
o = Obj(cl);
print(o.Name.Value); # foo
o.Name = "boo"
print(o.Name.Value); # boo

答案 1 :(得分:1)

您可以通过以下两种方式进行此操作。

1)在__init__的{​​{1}}方法上定义此关系:

Obj

2)使用属性装饰器为class Obj(object): def __init__(self, prop): self._props = [prop] self.Name = prop.Name 创建名为Name的方法。这样,您就可以像对待属性一样访问方法的返回值:

Obj

3)将class Obj(object): @property def Name(self): return self._props[0].Name 变成Obj的子类:

Prop

数字3)可能是在类之间进行这种交互而不失理智的最佳方法,但这也意味着class Obj(Prop): def __init__(self, prop, name, val): self._props = [prop]; super().__init__(name, val) 参数可能没有用(或者在这种情况下至少会造成混淆),并且可能意味着您需要更改最多的代码(此逻辑受影响的位置)。