【发布时间】:2013-04-27 23:24:09
【问题描述】:
假设我们有一个类:
注意:这只是一个虚拟类。
class C(object):
def __init__(self):
self.a = -10
self.b = 5
self.c = 2
def modify(self, **kwargs):
for keyword in kwargs:
vars(self)[keyword] = kwargs[keyword]
return(self)
我们想使用这个修改方法来改变我们对象中的值:
myclass = C()
myclass = myclass.modify(a=10)
但是当我想在原来的基础上更改值时,我必须这样写:
myclass = C()
myclass = myclass.modify(a=myclass.a/10)
或者:
myclass = myclass.modify(a=abs(myclass.a))
我的问题是,有没有办法在模块中创建一个全局变量,我可以导入它并将其用作当前值的占位符,所以我可以使用这个公式:
from globvars import current
myclass = C()
myclass = myclass.modify(
a=abs(current) % current ** 2,
b=current//2,
c=bool(current)
)
首先我尝试创建一个类,该类将存储它正在执行的操作和一个值,modify() 将首先查找其变量作为关键字,然后执行该函数。实际上它只适用于简单的情况,例如:current+10 或 current**2。
但是当我意识到时,我想将此current 与hsba(current)(颜色转换器)函数一起使用,其中current 指向存储在另一个对象中的对象,我只是放弃吧,我不能把这个写到我要使用的每一堂课上……
有解决办法吗?也许这很容易,我只是看不到它:)
提前感谢您的回复!
【问题讨论】:
-
在我看来,你把这件事过度复杂化了。为什么不像正常一样分配给属性?为什么
myclass = myclass.modify(a=10)比myclass.a = 10好? -
不要在这里使用
vars();for keyword, value in kwargs.iteritems(): setattr(self, keyword, value)的工作效率会更高。 -
@Lattyware 是的,我可以使用它,但在我的情况下,我想检查输入以验证它们。这就是我选择这种方法的原因。
-
@MartijnPieters 好点,谢谢!我将在我的代码中更改它!
-
@PeterVaro:为什么不使用
@property然后创建一个执行验证的setter?
标签: python oop class variables placeholder