作为 Python 2 的新手,我不确定如何以最“pythonic”的方式最好地组织我的类文件。我不会问这个,但事实上 Python 似乎有很多做事的方式与我对我习惯的语言所期望的非常不同。
最初,我只是按照我通常在 C# 或 PHP 中对待它们的方式来处理类,当我最终发现可变值陷阱时,这当然让我到处绊倒:
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
哎呀!没想到!
我花了很多时间在网上搜索其他项目的一些资源,以获取有关如何最好地安排我的课程的提示,我注意到的一件事是人们似乎声明了很多他们的实例变量 - 可变或否则 - 在构造函数中,并且还将默认构造函数参数堆得很厚。
在这样发展了一段时间之后,我仍然对它的不熟悉感到有些摸不着头脑。考虑到 python 语言使事情看起来更直观和明显的长度,在我有很多属性或很多默认构造函数参数的少数情况下,这对我来说似乎完全奇怪,尤其是当我'm 子类化:
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"
除了轻微的愚蠢(在制作这些人工示例类时我真的无法帮助自己),假设我在现实世界中需要一组具有这么多属性的类,我想我的问题是:
声明具有这么多属性的类的最“pythonic”方式是什么?如果默认值是不可变的,比如 Pants.pockets,最好将它们放在类中,还是将它们放在构造函数中,比如 ClassWithLotsOfAttributes.noisiness 更好?
有没有办法消除重新声明所有子类构造函数参数的默认值的需要,就像在 Dog.__init__ 中一样?无论如何,我是否应该将这么多参数包含在默认值中?