2013-07-08 4 views
1

Привет Я делаю программу на python, и мне трудно добавить глобальную переменную в мою программу, поэтому я просто отправлю свой код и покажу вам, как я пытался это сделать.Глобальные переменные в Python aa

Так что это мой класс:

import globalvariables 

class Bus : 

def __init__(self, Number, Capacity, Destination, Seats): 
    self.Bus_Number = Number 
    self.Bus_Capacity = Capacity 
    self.Bus_Destination = Destination 
    self.Seats_taken = Seats 

def Book(self): 
    self.Seats_taken = Seats + 1 

def ShowBus(self): 
    return (str(self.Bus_Number) + ", " + str(self.Bus_Capacity) + ", " + str(self.Bus_Destination) + ", " + str(self.Seats_taken)) 

и это мой модуль для глобальных переменных

Seats = 0 

и это то, что я пытаюсь запустить:

import Transport 
import globalvariables 

Big_Red = Transport.Bus(1, 50, "NYC", 0) 
Big_Red.Book() 

print(Big_Red.ShowBus()) 

Я получаю эту ошибку:

Traceback (most recent call last): 
    File "D:\Python\Assignment 3\Tester.py", line 5, in <module> 
    Big_Red.Book() 
    File "D:\Python\Assignment 3\Transport.py", line 14, in Book 
    self.Seats_taken = Seats + 1 
NameError: global name 'Seats' is not defined 

ответ

1

Переменная Seats является локальной для функции __init__ и не может быть доступна за ее пределами.

Так,

self.Seats_taken = Seats + 1 

Должно быть:

self.Seats_taken = self.Seats_taken + 1 

или:

self.Seats_taken += 1 

Вместо использования глобальных переменных внутри класса, вы должны использовать атрибуты класса:

class Bus : 
    seats = 50 #shared across all instances 
    def __init__(self): 
     #code 
    def Book(self): 
     self.Seats_taken = self.seats + 1 
+0

благодаря Brah, но если я действительно хотел сделать модуль глобальных переменных и использовать это в моем классе шины, как бы я это сделать? – Panthy

+0

@Panthy В каком файле вы указали переменную 'Seats'? –

+0

@Panthy Если это внутри 'globalvariables', то используйте' globalvariables.Seats'. Вам лучше создать атрибут класса «Сидения». –

1

Следует избегать глобализации. В случае, если вы все еще хотите быть:

def Book(self): 
    self.Seats_taken = globalvariables.Seats + 1 
0

Когда вы import globalvariables, вы получаете доступ к именам квалифицировано именем модуля: globalvariables.Seats. Чтобы импортировать Seats в пространство имен другого модуля, используйте from globalvariables import Seats. (В отчаянных случаях вы можете импортировать все имена из модуля: from globalvariables import *, но обычно вы этого не хотите.)

Когда вы определяете функцию, у нее есть собственное локальное пространство имен. Он включает в себя все аргументы функции.

Seats = 100 

def foo(Seats): 
    # returns the value of variable named Seats 
    # defined within "def foo", *not* defined by "Seats = 100" 
    return Seats 

print foo(200) # prints 200 
print foo() # fails because Seats are not set 

Для инициализации параметров функции, значение по умолчанию: использование

def foo(seats=0): 

print foo() # prints 0 
print foo(55) # prints 55 

Также global variables are evil. Глобальные константы хороши.

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

class SeatsDispenser(object): 
    def __init__(self, initial_count): 
    self.count = initial_count 

    def allocate(self, number_of_seats): 
    self.count -= number_of_seats 
    if self.count < 0: 
     raise ValueError("Overcommitted!") 

    def seats_left(self): 
    return self.number_of_seats 

именовании переменных, классы, константы , а функции с одним и тем же заголовком непрактичны. Обычно переменные являются lower_case, функции lowerCamelCase, классы TitleCamelCase и константы ALL_CAPS.

Разумный часть кода будет выглядеть следующим образом:

import constants # modules are usually lower case 
import transport 

def Bus(object): 
    def __init__(self, number, capacity, seats=constants.SEATS): 
    self.number = number 
    self.capacity = capacity 
    self.seats = seats 

big_red = Bus(constants.NYC_BUS_NUMBER, 50, 25) 
default_blue = Bus(1, 20) # seats not passed, the default value is used 

seats_dispenser = SeatsDispenser(100) 
seats_dispenser.allocate(big_red.count) 
seats_dispenser.allocate(default_blue.count) 
print seats_dispenser.seats.left() 
Смежные вопросы