2017-05-30 24 views
0

使用列表可以節省很多代碼行,但不會消除OOP背後的想法嗎?因爲使用函數式編程來實現它會更有意義。在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

是的,我認爲這是一個不好的做法。沒有確認列表中有兩個字符串,或者甚至它包含字符串。假設我傳遞了三個字符串或一個空列表的列表?然後怎樣呢?

但除此之外,你放棄了面向對象的大多數優點。這些類只是名稱,沒有與它們相關的行爲。沒有繼承的概念,也沒有明確的方式將其他信息與對象關聯起來。你會將它存儲在列表中的其他位置嗎?也沒有信息隱藏,因此無法確保任何不變量。任何有權訪問這些列表的人都可以隨時更改它們。

您可能還會像「蛇是爬行動物」,「狗是哺乳動物」,「鸚鵡是鳥」而不是使用列表那樣存儲字符串,而不是使用列表。

+0

感謝您的解釋。我可能使用了一個不好的例子,但我有你的觀點。 – Samy

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. 

如果您想針對每種寵物實施不同的「打印列表」,您可以考慮'類'。

相關問題