我有一种情况可以将对象作为类:
class BenjaminFranklin(Cat):
def __init__(self):
super().__init__()
self.ishungry = False
self.legs = 4
self.name_eng = 'Benjamin Franklin'
或类的实例:
benjamin_franklin = Cat()
benjamin_franklin.ishungry = False
benjamin_franklin.legs = 4
benjamin_franklin.name_eng = 'Benjamin Franklin'
“正确”选项似乎正在使用类的实例,因为没有名称为“本杰明·富兰克林”的猫。只有一只猫。但是它的可读性要差得多,尤其是当使用长名称时。
请告诉我
谢谢
答案 0 :(得分:3)
我认为,本杰明·富兰克林是一只猫。因此,它应该是cat类的实例。
您可以这样做的一种方式是:
class Cat:
def __init__(self, name_eng, is_hungry=False, legs=4):
self.ishungry = is_hungry
self.legs = legs
self.name_eng = name_eng
然后通过以下方式初始化您的实例:
benjamin_franklin = Cat("Benjamin Franklin") # is_hungry and legs do not to be passed, as they have the values you asked for defined as default
答案 1 :(得分:2)
我将改变您的benjamin_franklin
构造函数,以便采用适当构建该对象所需的参数,而不是按照您的方式构建Cat
。然后,您可以执行类似benjamin_franklin = Cat('Benjamin Franklin')
的操作,这样可读性更好。这样的构造函数看起来像:
def __init__(self, name_eng, is_hungry = False, legs = 4):
self.ishungry = is_hungry
self.legs = legs
self.name_eng = name_eng
但是,如果这不是一个选择,则可以将代码嵌入到工厂方法中:
def BenjaminFranklin():
benjamin_franklin = Cat()
benjamin_franklin.ishungry = False
benjamin_franklin.legs = 4
benjamin_franklin.name_eng = 'Benjamin Franklin'
return benjamin_franklin
如果您的对象上具有许多属性,则还可以尝试将该对象封装为子对象,然后将其传递到构造函数中。例如,假设您的Cat
具有name_eng
和name_cha
的身份:
class Identity:
def __init__(self, name_eng, name_cha):
self.name_eng = name_eng
self.name_cha = name_cha
class Cat:
def __init__(self, id, ishungry = False, legs = 4):
self.identity = id
self.is_hungry = ishungry
self.legs = legs
您可以这样初始化:
benjamin_franklin = Cat(Identity('Benjamin Franklin', '猫'))
这有点冗长,但这意味着您可以将构造扩展到多个对象上(并且可以创建一些常量对象,这些对象在类的大多数实例中都相同)。
答案 2 :(得分:0)
这两种选择都不对。名称BenjaminFranklin
表示这是某事物的实例。但是,问题是为什么no_legs
,is_hungry
等特定于本杰明·富兰克林,而不是特定于所有猫。看来这些属性应该移到父类Cat
上,本杰明·富兰克林应该是它的一个实例。
此外,如果只有本杰明·富兰克林有一个num_legs
变量,他将如何处理?没有添加使用新字段的功能。从这个意义上讲,这似乎更像是字典或namedtuple
,而不是类的实例。
但是,如果不了解Cat
类的功能以及如何使用本杰明·富兰克林的额外属性,就无法分辨出最好的方法是什么。