1

こんにちは、Python でプログラムを作成していますが、プログラムにグローバル変数を追加するのに問題があるため、コードを投稿して、どのように実行しようとしたかを示します。

これが私のクラスです:

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
4

3 に答える 3

1

グローバルは避けるべきです。あなたがまだそれをしたい場合:

def Book(self):
    self.Seats_taken = globalvariables.Seats + 1
于 2013-07-08T23:07:28.617 に答える
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
于 2013-07-08T22:51:13.733 に答える
0

の場合import globalvariables、モジュール名で修飾された名前にアクセスできます: globalvariables.SeatsSeats別のモジュールの名前空間にインポートするには、 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  

また、グローバル変数は悪です。グローバル定数は良いです。

グローバル変数を使用して、取得した座席を追跡したいと考えています。合理的なアクセスのみを許可し、値を任意に設定することを許可せず、必要に応じてアクセスをログに記録するなどのクラスにカプセル化すると、はるかに良くなります。

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()
于 2013-07-08T23:12:28.420 に答える