Python classvariable的setattribute
我试图在与另一个类中的变量建立连接后,设置一个类属性连接对象。我使用setattr设置变量。当我尝试访问变量时,该值为nullPython classvariable的setattribute,python,getattr,setattr,Python,Getattr,Setattr,我试图在与另一个类中的变量建立连接后,设置一个类属性连接对象。我使用setattr设置变量。当我尝试访问变量时,该值为null import importlib import json import sys import time import traceback from twisted.python import log import txredisapi from settings import gcl_decorator_init from twisted.internet import
import importlib
import json
import sys
import time
import traceback
from twisted.python import log
import txredisapi
from settings import gcl_decorator_init
from twisted.internet import reactor
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
class TestLogger(object):
connectionObj = None
@classmethod
def log(cls, data):
connObject = getattr(TestLogger, "connectionObj")
print("connObject is : ",connObject)
cls.connectionObj.publish("TestChannel","DataNew")
class TestServiceProtocol(txredisapi.SubscriberProtocol):
def connectionMade(self):
conn = txredisapi.lazyConnection(host=REDIS_HOST, port=REDIS_PORT)
print("connected. and alive.",conn)
setattr(TestLogger, "connectionObj", conn)
print('value of CollectorService.connection : ',getattr(TestLogger,"connectionObj"))
def messageReceived(self, pattern, channel, message):
pass
def connectionLost(self, reason):
print("lost connection to the redis server, Reason : ", reason)
class TestServiceFactory(txredisapi.SubscriberFactory):
maxDelay = 120
continueTrying = True
protocol = TestServiceProtocol
class TestService(object):
manager = None
connection = None
@staticmethod
def initialize():
try:
svc = TestServiceFactory()
return svc
except Exception as ex:
log.msg("Exception {}".format(traceback.format_exc()))
log.msg("Failed to initialize service {}".format(ex))
time.sleep(5)
raise ex
if __name__ == '__main__':
svc = TestService.initialize()
reactor.connectTCP(REDIS_HOST, REDIS_PORT, svc)
reactor.run()
下面是测试程序
from untitled import TestLogger
if __name__ == "__main__":
testLogger = TestLogger()
print("connection from object : ",getattr(testLogger,"connectionObj"))
TestLogger.log("Data")
需要帮助确定我哪里出错。classmethod是否合适?如果访问对象的方法错误,也会抛出建议。据我所见,
TestLogger
中的类变量只有在调用TestService.initialize()
时才会获得值。但是在测试程序的上下文中不会发生这种情况,因为的那部分没有标题(?)导入该模块时,不会显式执行该模块,因为在\uuuuu name\uuuuuuu=='\uuuuuuu main\uuuuu'
block@shmee请理解程序和问题。然后请解释您认为执行测试程序时,connectionObj
应该如何获得值。因为我看不出有任何方法可以从你们分享的东西中得到。若你们能看到的话,第一个程序也有一个主功能。其中的reactor.run()将使其作为服务器运行。我的意图是设置我认为很好的类变量。或者我可能错了,因为我试图从其他进程访问,而这正是我需要帮助的地方@shmeeYes,这正是重点。您的测试程序在另一个进程中运行。Python在测试程序进程的命名空间中为TestLogger
创建一个类对象,该类对象在代码中是如何定义的,即None
作为connectionObj
的值。redis连接对象已分配给另一个进程的类对象中的该类变量,这一事实对于测试程序进程是不可见的。您将需要一种使这两个进程相互通信的方法。我想起来了。