#python #variables #python-3.x #module
#python #переменные #python-3.x #модуль
Вопрос:
У меня такая ситуация:
library_file1.py:
class A:
def foo(self):
print("bar")
def baz(self):
pass
project_file.py:
from library_file1 import A
class B(A):
def baz(self):
print(the_variable)
library_file2.py:
from project_file import B
the_variable = 7
b = B()
b.foo() # prints "bar"
b.baz() # I want this to print "7", but I don't know how
Как мне разрешить запись кода в project_file.py
, который может обращаться к переменным из library_file2.py ? Единственное решение, о котором я могу думать, это:
project_file.py:
from library_file1 import A
class B(A):
def baz(self, the_variable):
print(the_variable)
library_file2.py:
from project_file import B
the_variable = 7
b = B()
b.foo()
b.baz(the_variable)
но это кажется неудобным и не масштабируется до многих переменных, таких как the_variable
.
Комментарии:
1. Вы можете использовать список переменных
b.baz( [var1, var2] )
или словарьb.baz( {'var1':7, 'var2':9} )
, а затем вам нужно перестроитьbaz()
2. @furas Но тогда переменные должны были бы использоваться как
the_variable[7]
, что довольно неясно. Я мог бы передать экземпляр пользовательского класса и сделатьthe_variable.var1
, что было бы лучше, но я все равно хотел бы избежать этого, если это возможно.
Ответ №1:
Довольно просто: вам нужно, чтобы переменная была в project_file.py
вместо library_file2.py
. Измените project_file
на:
from library_file1 import A
the_variable = None
class B(A):
def baz(self):
print(the_variable)
А затем в library_file2
:
import project_file
from project_file import B
project_file.the_variable = 7
b = B()
b.foo() # prints "bar"
b.baz() # prints "7"
Использование аргумента также является хорошим решением (вам следует избегать глобальных значений, насколько это возможно).
В Python нет такой вещи, как действительно глобальная переменная. Переменные всегда привязаны к области видимости. Обычно мы говорим, что переменная является «глобальной», когда она находится в области действия модуля.
Самая широкая область — это встроенная область, поэтому теоретически было бы возможно добавить что-то как встроенное. Однако это действительно плохая практика. Также это не устраняет проблему, потому что все файлы могут получить доступ к этому новому встроенному, но они не могут повторно назначить его без явного указания области.