我正在尝试调用函数来初始化我的全局类级变量。请注意,由于某种原因,我无法编写构造函数来完成这项工作。 (原因:我正在为Tempest写一个测试用例)
代码:
class my_class(ParentClass):
username = "abc"
password = "123"
hostname = self._get_hostname() # Error: self is undefined
hostname = _get_hostname() # Error: _get_hostname is undefined
def myFunct(self):
...
...
def _get_hostname(self):
...
...
甚至可以在python中使用类函数初始化 global 类级变量吗?
注1:我还尝试在编写hostname
函数后执行_get_hostname()
初始化,但没有用。
注2:我可以在以下函数中执行hostname
初始化:
def myFunction(self):
hostname = self._get_hostname()
# do something with hostname
...
但这会破坏使用全局类级变量的整个目的。我想在其他函数中使用类强度变量重新使用。
答案 0 :(得分:0)
首先:它们不是全局变量;它们是 class 变量。 (全局定义在模块范围内。)
如果_get_hostname()
根本没有使用 self
,您可以做一些有点粗略的事情:确保在之前定义你使用它,然后用假的第一个参数调用它。
class my_class(ParentClass):
def _get_hostname(self):
...
hostname = _get_hostname(None) # Doesn't matter what
这是有效的,因为当您在class
语句中调用它时,您仍然可以将其视为常规函数。只需在使用它之前定义它,就像任何函数一样。
如果它确实需要引用一个对象(甚至只是一个类),这将不起作用,因为该类尚不存在。您可以做的最好的事情是在class
语句之前定义一个不使用类本身并调用它的函数。 (这也是你要做的
如果以前的选择是可能的,但......令人反感。)
def _get_hostname():
...
class my_class(ParentClass):
hostname = _get_hostname()
或推迟初始化类变量,直到定义class
为止。在这种情况下,_get_hostname
可能应该声明为静态方法或类方法,这样您就不必实例化类来初始化类变量。
class my_class(ParentClass):
@classmethod
def _get_hostname1(cls):
...
@staticmethod
def _get_hostname2():
...
my_class.hostname = my_class._get_hostname1()
my_class.hostname = my_class._get_hostname2()
答案 1 :(得分:0)
您无法为尚不存在的实例调用实例方法。如果您希望它独立于任何实例,并且您调用的函数不需要实例中的任何信息,则可以使用@staticmethod装饰器,以便可以静态调用get hostname。