繁体   English   中英

在任何方法之外调用函数但在类中?

[英]Call a function outside any method but inside a class?

我正在尝试调用函数来初始化我的 全局 类级变量。 请注意,由于某种原因,我无法编写构造函数来完成这项工作。 (原因:我正在为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中使用类函数初始化 全局 类级变量?

注1:我还尝试在写入_get_hostname()函数后执行hostname初始化,但没有用。

注2:我可以在一个函数中执行hostname初始化,例如:

def myFunction(self):
    hostname = self._get_hostname()
    # do something with hostname
    ...

但这会破坏使用 全局 类级变量的整个目的。 我想使用类级变量在其他函数中重用

第一:它们不是全局变量; 它们是变量。 (全局变量在模块范围内定义。)

如果_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()

您不能为尚不存在的实例调用实例方法。 如果您希望它独立于任何实例,并且您调用的函数不需要实例中的任何信息,则可以使用@staticmethod装饰器,以便可以静态调用get hostname。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM