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

时间:2017-05-30 05:02:31

标签: python oop inheritance terminology

使用列表可以节省很多行代码,但是它不会扼杀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无用吗?或者我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

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

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

你也可以存储像“蛇是爬行动物”,“狗是哺乳动物”和“鹦鹉是鸟”等字符串,而不是使用列表。

答案 1 :(得分:0)

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

在上面的示例中,如果您的目的只是存储数据并打印它们(使用标准方法),请使用“list”。 这就足够了。

另一方面,如果您希望每个“变种”以行为不同,请使用类。

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.

如果你想为每种宠物实施'printlist',你可以考虑'Classes'。