Есть ли питонический способ заменить глобальную переменную или переменную класса - PullRequest
0 голосов
/ 13 мая 2018

Я использовал переменные класса, чтобы заменить избегать использования глобальных переменных, но я думаю, что это не питон, может кто-нибудь дать мне лучший способ?

путь переменной класса:

class A(object):
    _func_map=dynamic_load_from_module()
    _ad_map = dynamic_load_from_another_module()
    @classmethod
    def check_status(cls,host,port,user):
        #do something other
        return cls._func_map[user].verify()
    @classmethod
    def check_ad(cls,host,port,user):
        #do something other
        return cls._ad_map[user].check()

путь глобальной переменной:

_global_func_map = dynamic_load_from_module()
_global_ad_map = dynamic_load_from_another_module()
def check_status(host,port,user):
    #do something other
    global _global_func_map 
    return _global_func_map[user].verify()
def check_ad(host,port,user):
    #do something other
    global _ad_map
    return _ad_map[user].check()

1 Ответ

0 голосов
/ 13 мая 2018

Думаю, самый питонский способ - это модуль:

#!/usr/env/bin/python
def dynamic_load_from_module(): pass
def dynamic_load_from_another_module(): pass

fun_map = dynamic_load_from_module()
ad_map = dynamic_load_from_another_module()

Так что вы используете его как модуль:

from module import fun_map, ad_map
class Foo(object):

    @classmethod
    def check_ad(cls,host,port,user):
        return ad_map[user].check()

Но если вам нужно, чтобы они вызывались при создании вашего экземпляра, вы можете захотеть сделать что-то вроде

#!/usr/env/bin/python
def dynamic_load_from_module(): pass
def dynamic_load_from_another_module(): pass

(То есть вы просто определяете функции внутри модуля)

from module import dynamic_load_from_module, dynamic_load_from_another_module

class Foo(object):
    def __init__(self):
        self._fun_map = dynamic_load_from_module()
        self._ad_map = dynamic_load_from_another_module()

Или, если вам нужно, чтобы они вызывались при создании экземпляра, но при этом оставались атрибутом класса:

from module import dynamic_load_from_module, dynamic_load_from_another_module

class Foo(object):
    _fun_map = dynamic_load_from_module()
    _ad_map = dynamic_load_from_another_module()

Существует множество других способов (свойства, метод класса, статические методы и т. Д.), Но я уверен, что этот модуль является наиболее питоническим. Более того, его действительно легко настроить, прочитать и понять - так почему бы и нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...