Będąc stosunkowo nowym produktem Python 2, nie jestem pewien, jak najlepiej uporządkować pliki klas w sposób najbardziej "pytonowy". Nie pytałbym o to, ale o to, że Python wydaje się mieć kilka sposobów robienia rzeczy, które są bardzo różne od tego, czego oczekiwałem od języków, do których jestem przyzwyczajony.Najbardziej "pythonic" sposób organizowania atrybutów klas, argumentów konstruktora i domyślnych konstruktorów podklasy?
Początkowo właśnie traktowanie zajęcia jak ja zwykle traktować je w C# lub PHP, co oczywiście sprawiło mi utrącają w każdym miejscu, kiedy w końcu odkrył zmienne wartości Gotcha:
class Pants(object):
pockets = 2
pocketcontents = []
class CargoPants(Pants):
pockets = 200
p1 = Pants()
p1.pocketcontents.append("Magical ten dollar bill")
p2 = CargoPants()
print p2.pocketcontents
Yikes! Nie spodziewałem się tego!
Spędziłem dużo czasu na wyszukiwaniu w Internecie i poprzez źródła innych projektów, aby uzyskać wskazówki, jak najlepiej uporządkować moje zajęcia, a jedną z rzeczy, które zauważyłem, było to, że ludzie deklarują wiele swoich instancji zmienne - zmienne lub nie - w konstruktorze, a także stosy domyślnych argumentów konstruktora dość gęsto.
Po takim rozwinięciu przez jakiś czas, wciąż mam zamiar trochę drapać się po głowie w związku z nieznajomością tego. Biorąc pod uwagę długość, z jaką język Pythona przechodzi do sprawienia, że rzeczy wydają się bardziej intuicyjne i oczywiste, wydaje mi się to wprost dziwne w tych kilku przypadkach, w których mam dość dużo atrybutów lub wiele domyślnych argumentów konstruktora, szczególnie gdy „m instacji:
class ClassWithLotsOfAttributes(object):
def __init__(self, jeebus, coolness='lots', python='isgoodfun',
pythonic='nebulous', duck='goose', pants=None,
magictenbucks=4, datawad=None, dataload=None,
datacatastrophe=None):
if pants is None: pants = []
if datawad is None: datawad = []
if dataload is None: dataload = []
if datacatastrophe is None: datacatastrophe = []
self.coolness = coolness
self.python = python
self.pythonic = pythonic
self.duck = duck
self.pants = pants
self.magictenbucks = magictenbucks
self.datawad = datawad
self.dataload = dataload
self.datacatastrophe = datacatastrophe
self.bigness = None
self.awesomeitude = None
self.genius = None
self.fatness = None
self.topwise = None
self.brillant = False
self.strangenessfactor = 3
self.noisiness = 12
self.whatever = None
self.yougettheidea = True
class Dog(ClassWithLotsOfAttributes):
def __init__(self, coolness='lots', python='isgoodfun', pythonic='nebulous', duck='goose', pants=None, magictenbucks=4, datawad=None, dataload=None, datacatastrophe=None):
super(ClassWithLotsOfAttributes, self).__init__(coolness, python, pythonic, duck, pants, magictenbucks, datawad, dataload, datacatastrophe)
self.noisiness = 1000000
def quack(self):
print "woof"
Mild głupota bok (nie mogę naprawdę pomóc sobie podczas gotowania się te sztuczne przykładowe zajęcia), zakładając, że mam świecie rzeczywistym potrzebne do zestawu klas z tym wiele atrybutów, ja Przypuśćmy, że moje pytania to:
Jaki jest najbardziej, uh, "pytonowy" sposób deklarowania klasy o tak wielu atrybutach? Czy najlepiej jest umieścić je przeciwko klasie, jeśli domyślne ustawienie jest niezmienne, np. Pants.pockets, czy lepiej jest umieścić je w konstruktorze, ala ClassWithLotsOfAttributes.noisiness?
Czy istnieje sposób na wyeliminowanie potrzeby ponownego sprawdzenia wartości domyślnych dla wszystkich argumentów konstruktora podklasy, jak w przypadku parametru Dog .__ init__? Czy mimo to powinienem wliczyć tak wiele argumentów z ustawieniami domyślnymi?
+1 Uwielbiam przykładowe atrybuty. Również dobre pytanie. – balpha