将所有信息放入列表而不是 OOP 中的类继承是不好的做法吗?

Posted

技术标签:

【中文标题】将所有信息放入列表而不是 OOP 中的类继承是不好的做法吗?【英文标题】:Is it bad practice to put all information into lists instead of class inheritance in OOP? 【发布时间】:2017-10-30 10:19:17 【问题描述】:

使用列表可以节省很多代码行,但它不会扼杀 OOP 背后的理念吗?因为使用函数式编程来实现它会更有意义。

在 Python 中使用列表的示例:

class Pets:

    def printlist(self, petslist):
        for pet in petslist:
            print pet[0]+ " is a "+pet[1]

pet = Pets()
pet.printlist([('parrot','bird'),('snake','reptile'),('dog','mammal')])is a "+pet[1]

一个使用类继承的例子:

class Pets:
        def __init__(self, pet, petclass):
                self.petclass=petclass
                self.pet=pet

        def printlist(self):
                print self.pet+" is a  "+self.petclass

class Dog(Pets):
        def __init__(self):
                Pets.__init__(self, "dog", "mammal")

class Parrot(Pets):
        def __init__(self):
                Pets.__init__(self, "parrot", "bird")

class Snake(Pets):
        def __init__(self):
                Pets.__init__(self, "snake", "reptile")

x = Dog()
x.printlist()

y = Parrot()
y.printlist()

z = Snake()
z.printlist()

另外,如果列表太大而无法通过继承处理怎么办?使用可以从文本文件或其他东西导入的列表不是更容易吗?

这会使 OOP 在这种情况下无用吗?还是我在这里遗漏了什么?

【问题讨论】:

【参考方案1】:

是的,我认为这是一种不好的做法。没有验证该列表有两个字符串,甚至根本没有验证它包含字符串。假设我传递了一个包含三个字符串的列表,或者一个,或者一个空列表?然后呢?

但除此之外,您将放弃 OOP 的大部分优势。这些类只是名称,没有与它们相关的行为。没有继承的概念,也没有明确的方法将其他信息与对象相关联。您会将其存储在列表中的其他位置吗?也没有信息隐藏,因此无法确保任何不变量。有权访问列表的任何人都可以随时更改它们。

您不妨存储诸如“蛇是爬行动物”、“狗是哺乳动物”和“鹦鹉是鸟”之类的字符串,而不是使用列表。

【讨论】:

感谢您的解释。我可能举了一个不好的例子,但我明白你的意思。【参考方案2】:

这是人们在尝试确定对象的用途时遇到的问题。 如果对象要“存储”一些数据,则对象必须以特定方式运行。

在上面的示例中,如果您的意图只是存储数据并打印它们(使用标准方法),请使用“列表”。 这足以达到目的。

另一方面,如果您希望每个“品种”表现不同,请使用类。

class Pet:
    def makeSound(self, args):
        None

class Dog(Pet):
    def makeSound(self, args):
        'Specific behaviour ONLY for Dogs.

class Parrot(Pet):
    def makeSound(self, args):
        'Specific behaviour ONLY for Parrots.

如果您想为每种宠物以不同的方式实现“打印列表”,您可以考虑使用“类”。

【讨论】:

以上是关于将所有信息放入列表而不是 OOP 中的类继承是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python OOP-2

OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)

OOP 和私有字段的继承

Java核心技术 笔记五 OOP

OOP三个基本特征:封装继承多态

基类和继承类的 XML 序列化信息