2016-04-17 20 views
-1

Ich habe 3 Klassen (City, Neighborhood und Block). HierAbleiten einer Klasse von einer abgeleiteten Klasse

ist die Definition der City Klasse:

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

Definition des Neighborhood:

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 

Definition des 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 

Dann erkläre ich Einheiten:

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

Und diesen Fehler:

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

Warum verwenden Sie die Vererbung dafür? Es scheint eher ein Kompositionsproblem zu sein. Was ist mit den Attributen '__two_leading_underscore'? Willst du den Namen Mangling verwenden? – jonrsharpe

+1

Verwenden Sie keine doppelten führenden Unterstriche in Ihren Variablennamen. Je. – snakecharmerb

+0

@snakecharmerb: Verwenden Sie sie beim Entwerfen eines Frameworks, und minimieren Sie die Wahrscheinlichkeit, dass Entwickler, die Ihr Framework verwenden, Attributnamen erstellen, die mit Ihrer internen Implementierung kollidieren. Dafür ist das Feature gedacht. –

Antwort

1

Sie haben vergessen, in self in Ihrer Block.__init__() Implementierung weitergeben müssen:

Neighborhood.__init__(*neighborhood_args, **kwargs) 

so das erste übergebene Argument eine ganze Zahl statt. Jetzt Neighbourhood.__init__() hat self an 1 gebunden, und Sie erhalten Ihren Fehler. Einfach hinzufügen self:

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