2016-07-01 1 views
0

Я попытался инициализировать производный класс по умолчанию __init__function суперкласса, а затем попытался использовать глобальную переменную, которая инициализировалась в функции init. но было сообщение об ошибке говорит, переменная "д-р" в классе One не определенpython производный класс вызовет глобальную переменную, которая была инициализирована в суперклассе

base.py:

class Base(object): 
    dr = None 
    def __init__(self, driver): 
     global dr 
     dr = driver 

one.py

class One(Base): 
    def fun(self): 
     print(dr) 

if __name__=="__main__": 
    driver = 1 
    test = One(driver) 
    test.fun() 
+0

потому что в моем реальном случае используйте переменную «dr» много раз, я не думаю, что хорошо передавать ее с каждой функцией или инициализировать ее в каждом классе. – Kernel

+0

Какая переменная? Как показано, я ожидал бы 'NameError' при поиске' Base'. Почему бы не сделать 'dr' атрибутом экземпляра? – jonrsharpe

+0

Я пропустил оператор импорта, надеюсь, что вы не возражаете. – Kernel

ответ

0

Вы определили dr как переменная класса, статическое поле, доступное для всех классов, и вы должны увидеть это поле со всех объектов с помощью Base.dr. global не следует использовать в методах, а скорее в функциях.

Эта переменная класса не унаследована и One.dr не определен.

Чтобы иметь доступ к dr объектам подкласса, вам необходимо сделать его переменной экземпляра. Измените базовый класс как

class Base(object): 
    #dr = None # this will differ from self.dr even if you let it here 
    def __init__(self, driver): 
     self.dr = driver 

Вы можете использовать его в подклассе, как

class One(Base): 

    def __init__(self,driver): 
     super(Base, self).__init__(driver) #call constructor of superclass 
    def fun(self): 
     print(self.dr) 
+0

ха-ха, я знаю, что это может решить мою проблему, но я просто не хочу добавлять «я». везде, я так ленив. но спасибо еще – Kernel

+0

Чтение комментария к другому сообщению вы должны определить статический метод, чтобы импортировать их из класса 'Base' так же просто, как' dr = Base.dr' –

1

Это потому, что global стенды для глобальной области видимости модуля, поэтому глобальной области base.py не то же самое глобальный охват в one.py, таким образом global не будет работать. Вот решение для совместного использования переменных между модулями https://stackoverflow.com/a/142566/4472389. Но просто избегайте этого типа кода.

+0

Но для вызова этой переменной по-прежнему нужно использовать имя модуля. В моем случае я хочу, чтобы эта переменная инициализировалась один раз и использовала во всех подклассах ... точно так же, как она используется в суперклассе, не нужна сама. или module_name. доступа – Kernel

0

Наконец, я изменить мой код так:

base.py:

class Base(object): 
    def __init__(self, driver): 
     self.dr = driver 
     global dr 
     dr = driver 

one.py

class One(Base): 
    def __init__(self, driver): 
     super().__init__(driver) 
     global dr 
     dr = self.dr 

    def fun(self): 
     print(dr) 

if __name__=="__main__": 
    driver = 1 
    test = One(driver) 
    test.fun() 

Может быть, это не очень элегантно, и я не знаю, если это хорошее решение, но я могу использовать переменную «dr» в производных классах столько раз, сколько захочу, и мне не нужно «я», чтобы называть ее.