Python присвоить атрибуту локальное значение в импортированном модуле - PullRequest
0 голосов
/ 25 мая 2020

В Script1 я определил class1.

Чтобы инициировать class1, вам нужна только одна переменная x, но у нее есть другой атрибут y, который не требуется для инициации класса. Когда я запускаю сценарий 1, он присваивает значение 10 переменной y, которая объявляется после строки if __name__ == __main__:.

######Script1#########
Class class1:
    def __init__(self,x):
        self.x = x
        self.y = y
if __name__ == '__main__':
    y = 10
    class_instance = class1(100)
    print(class_instance.y) #prints 10 or assigns 10 to class.y

В сценарии 2 я импортирую class1 и пытаюсь присвоить значение y, но это дает мне NameError. Я попытался объявить y как global в class1 и еще кое-что, но это не работает. Я понимаю, что это как-то связано с пространством имен и областью видимости - любой указатель в правильном направлении будет большим подспорьем. Спасибо.

#### script2 ######
from script1 import *
if __name__ == '__main__':
    y = 10
    class_instance = class1(200)
    print(class_instance.y) #gives NameError
NameError: name 'y' is not defined

1 Ответ

2 голосов
/ 25 мая 2020

Здесь вы хотите указать необязательный keyword argument (https://docs.python.org/3/tutorial/controlflow.html#keyword -аргументы ):

Class class1:
    def __init__(self,x, y=10):
        self.x = x
        self.y = y
if __name__ == '__main__':
    class_instance = class1(100)
    print(class_instance.y)              #prints 10 

    instance2 = class1(100,200)
    print(instance2.y)                   #prints 200 

    instance3 = class1(100,y=300)
    print(instance3.y)                   #prints 300 

Это позволит вам указать значение y, если вы sh. Если вы не укажете значение y, будет использовано значение по умолчанию 10.

...