Python 使线程的目标成为 属性 setter
Python making the target of a Thread be a property setter
我有一个 class 有:
- 私有实例属性
- 使用
property
装饰器为属性制作 getter 和 setter
如何使 setter 成为 threading.Thread
的目标可调用对象?
问题似乎是 setter 不可调用。对此有好的解决方法吗?
示例代码
我目前的解决方法是在不使用 property
装饰器的情况下制作 setter。
但是,我真的不想再添加第二个setter。有没有更好的方法?
from threading import Thread
class SomeClass:
def __init__(self):
self._some_attr = 0
@property
def some_attr(self) -> int:
return self._some_attr
@some_attr.setter
def some_attr(self, val: int):
self._some_attr = val
def set_some_attr(self, val: int):
self._some_attr = val
some_class = SomeClass()
my_thread = Thread(target=SomeClass.set_some_attr, args=(some_class, 1)) # This works fine
my_thread.start()
my_thread.join()
print(some_class.some_attr)
my_thread2 = Thread(target=SomeClass.some_attr, args= # How is this done?
my_thread2.start()
my_thread2.join()
print(some_class.some_attr)
SomeClass.some_attr
returns一个property
对象,确实是不可调用的。这个 属性 对象有两个对您有用的属性 - fget
和 fset
属性,它们包含 属性 的 getter 和 setter 函数. fget
总是指向一个函数,而 fset
如果没有定义 setter 则可能是 None
。
在单独线程中使用 setter 的示例:
my_thread2 = Thread(target=SomeClass.some_attr.fset, args=(some_class, 1))
my_thread2.start()
my_thread2.join()
print(some_class.some_attr)
kmaork 的答案有效,但您也可以只使用 setattr
:
thread = Thread(target=setattr, args=(obj, 'attrname', value))
这避免了依赖有关如何实现属性的任何实现细节。您不需要将 setter 设为目标;你只需要让目标设置属性。
我有一个 class 有:
- 私有实例属性
- 使用
property
装饰器为属性制作 getter 和 setter
如何使 setter 成为 threading.Thread
的目标可调用对象?
问题似乎是 setter 不可调用。对此有好的解决方法吗?
示例代码
我目前的解决方法是在不使用 property
装饰器的情况下制作 setter。
但是,我真的不想再添加第二个setter。有没有更好的方法?
from threading import Thread
class SomeClass:
def __init__(self):
self._some_attr = 0
@property
def some_attr(self) -> int:
return self._some_attr
@some_attr.setter
def some_attr(self, val: int):
self._some_attr = val
def set_some_attr(self, val: int):
self._some_attr = val
some_class = SomeClass()
my_thread = Thread(target=SomeClass.set_some_attr, args=(some_class, 1)) # This works fine
my_thread.start()
my_thread.join()
print(some_class.some_attr)
my_thread2 = Thread(target=SomeClass.some_attr, args= # How is this done?
my_thread2.start()
my_thread2.join()
print(some_class.some_attr)
SomeClass.some_attr
returns一个property
对象,确实是不可调用的。这个 属性 对象有两个对您有用的属性 - fget
和 fset
属性,它们包含 属性 的 getter 和 setter 函数. fget
总是指向一个函数,而 fset
如果没有定义 setter 则可能是 None
。
在单独线程中使用 setter 的示例:
my_thread2 = Thread(target=SomeClass.some_attr.fset, args=(some_class, 1))
my_thread2.start()
my_thread2.join()
print(some_class.some_attr)
kmaork 的答案有效,但您也可以只使用 setattr
:
thread = Thread(target=setattr, args=(obj, 'attrname', value))
这避免了依赖有关如何实现属性的任何实现细节。您不需要将 setter 设为目标;你只需要让目标设置属性。