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

时间:2016-04-13 04:39:08

标签: python python-2.7 oop python-3.x global-variables

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

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

2 个答案:

答案 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。