我可以使用插入类实例的类来提高可读性吗?

时间:2018-09-19 14:52:15

标签: python python-3.x

我有一种情况可以将对象作为类:

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'

“正确”选项似乎正在使用类的实例,因为没有名称为“本杰明·富兰克林”的猫。只有一只猫。但是它的可读性要差得多,尤其是当使用长名称时。

请告诉我

  • “在这种情况下,您可以使用类来提高可读性,因为...”
  • “唯一正确的选择是使用实例,因为...”
  • 其他地方

谢谢

3 个答案:

答案 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_engname_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_legsis_hungry等特定于本杰明·富兰克林,而不是特定于所有猫。看来这些属性应该移到父类Cat上,本杰明·富兰克林应该是它的一个实例。

此外,如果只有本杰明·富兰克林有一个num_legs变量,他将如何处理?没有添加使用新字段的功能。从这个意义上讲,这似乎更像是字典或namedtuple,而不是类的实例。

但是,如果不了解Cat类的功能以及如何使用本杰明·富兰克林的额外属性,就无法分辨出最好的方法是什么。