2016-04-17 18 views
-1

私は3クラス(City,Neighborhood、およびBlock)を持っています。ここで派生クラスからクラスを派生させる

Cityクラスの定義です:Neighborhood

class City: 
    def __init__(self, id_city, name_city): 
     self.__id = id_city 
     self.__name = name_city 

定義:Block

class Neighborhood(City): 
    def __init__(self, id_neighborhood, name_neighborhood, number_block, *city_args, **kwargs): 
     City.__init__(self, *city_args, **kwargs) 
     self.__id = id_neighborhood 
     self.__name = name_neighborhood 
     self.__number = number_block 

が定義:

class Block(Neighborhood): 
    def __init__(self, id_block, number_block, number_flats, *neighborhood_args, **kwargs): 
     Neighborhood.__init__(*neighborhood_args, **kwargs) 
     self.__id = id_block 
     self.__number_b = number_block 
     self.__number_f = number_flats 

その後、私は実体を宣言します。

city = City(5, "New York") 
neighborhood = Neighborhood(1, "Brooklyn", 500, 5, "New York") 
block = Block(11, 2, 20, 1, "Brooklyn", 500, 5, "New York") 

そして、このエラーが出ます:

AttributeError: 'int' object has no attribute '_City__id' 
+6

なぜこれを継承していますか?それは構成上の問題のようです。また、 '__two_leading_underscore'属性には何がありますか?名前マングリングを使用することを意味しますか? – jonrsharpe

+1

変数名に二重先頭のアンダースコアを使用しないでください。これまで – snakecharmerb

+0

@snakecharmerb:フレームワークを設計するときにそれらを使用し、フレームワークを使用する開発者が内部実装と衝突する属性名を作成する可能性を最小限にする必要があります。それが機能のために設計されたものです。 –

答えて

1

あなたBlock.__init__()実装でselfに渡すのを忘れ:

Neighborhood.__init__(*neighborhood_args, **kwargs) 

そうに渡された最初の引数ではなく整数です。今Neighbourhood.__init__()はにバインドされたselfを持っており、エラーが発生します。単純に追加してくださいself

class Block(Neighborhood): 
    def __init__(self, id_block, number_block, number_flats, *neighborhood_args, **kwargs): 
     Neighborhood.__init__(self, *neighborhood_args, **kwargs)