所以,我编写了一个小程序,基本上可以做到这一点:
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 = "";
我可以使用任何下划线(双_)功能吗?还是有什么解决办法?
如果是这样,我将如何在此系统上实现它?
答案 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)
参数可能没有用(或者在这种情况下至少会造成混淆),并且可能意味着您需要更改最多的代码(此逻辑受影响的位置)。