Python:在 class 中使用 __getattribute__ 有什么问题吗?
Python: Is there any issue with using __getattribute__ within a class?
我创建了一个 class 来管理消息服务的订阅。由于与每个订阅的配置相关的原因,class 实例化了三个单独的客户端,class 的每个实例也实例化了三个。为了将三个客户端的实例化为一个 for 循环,我使用了 __getattribute__
和 __setattr__
。我已经阅读了有关这些方法的其他主题,但我不确定像我这样使用它们是否会导致问题。这是一个非常简单的例子:
class BaseClient(object):
def __init__(self, name):
self.name = name
def connect(self):
return 'client logged on'
def do_other_things(self):
return 'other things done'
class MsgServiceListener(object):
def __init__(self):
self.client1 = None
self.client2 = None
self.client3 = None
self.clientNames = ['client1', 'client2', 'client3']
def createAndSubscribe(self):
for client in self.clientNames:
if not self.__getattribute__(client):
self.__setattr__(client, BaseClient(client))
self.__getattribute__(client).connect()
self.__getattribute__(client).do_other_things()
我利用下划线方法的方式有什么问题吗?
您应该使用 getattr(self, client)
和 setattr(self, client, value)
...[= 而不是使用双下划线方法 __setattr__
/__getattr__
(或 __getattribute__
) 16=]
但更好的是,如果您需要将名称映射到对象,您应该只使用字典。
class MsgServiceListener:
def __init__(self):
self.clients = {}
self.clientNames = ["client1", "client2", "client3"]
def createAndSubscribe(self):
for client in self.clientNames:
self.clients[client] = c = BaseClient(client)
c.connect()
c.do_other_things()
我创建了一个 class 来管理消息服务的订阅。由于与每个订阅的配置相关的原因,class 实例化了三个单独的客户端,class 的每个实例也实例化了三个。为了将三个客户端的实例化为一个 for 循环,我使用了 __getattribute__
和 __setattr__
。我已经阅读了有关这些方法的其他主题,但我不确定像我这样使用它们是否会导致问题。这是一个非常简单的例子:
class BaseClient(object):
def __init__(self, name):
self.name = name
def connect(self):
return 'client logged on'
def do_other_things(self):
return 'other things done'
class MsgServiceListener(object):
def __init__(self):
self.client1 = None
self.client2 = None
self.client3 = None
self.clientNames = ['client1', 'client2', 'client3']
def createAndSubscribe(self):
for client in self.clientNames:
if not self.__getattribute__(client):
self.__setattr__(client, BaseClient(client))
self.__getattribute__(client).connect()
self.__getattribute__(client).do_other_things()
我利用下划线方法的方式有什么问题吗?
您应该使用 getattr(self, client)
和 setattr(self, client, value)
...[= 而不是使用双下划线方法 __setattr__
/__getattr__
(或 __getattribute__
) 16=]
但更好的是,如果您需要将名称映射到对象,您应该只使用字典。
class MsgServiceListener:
def __init__(self):
self.clients = {}
self.clientNames = ["client1", "client2", "client3"]
def createAndSubscribe(self):
for client in self.clientNames:
self.clients[client] = c = BaseClient(client)
c.connect()
c.do_other_things()