创建课程遵循哪种策略?

时间:2014-01-06 15:14:26

标签: python class

我正在努力学习课程的运作方式。我想用一些共享元素创建不同的类,而不是其他类,但据我所知,我可以通过三种不同的方式创建它:

  • 创建一个包含所有共享元素的类,然后继承此类并修改新类中的特定方法和属性。这样的事情:

     class Enemy(object):  
         """Enemy!"""  
        def __init__(self, damage=30, life=100, enemy="Hero"):  
        #And keep defining the class and its methods and attributes in common with all the enemys
    
     class Troll(Enemy):  
         """Troll!"""
         def __init__ (self, defense=0):  
         #And define the specific attributes and methods for Trolls.
    
  • 创建一个类并询问一种类,并更改从中获取输入的对象的定义。这样的事情:

    class Enemy(object):  
         """Enemy!"""  
         def __init__(self, damage=30, defense=0, life=100, type="Troll" enemy="Hero"):  
             if type=="Troll":  
                #Do that for type "Troll"  
             if type=="Goblin":  
                #Do that for type  "Goblin"  
             #And keep defining the class and its methods and attributes for each accepted type
    
  • 创建两个不同的类,然后执行多重继承:

    class Enemy(object):  
        """Enemy!"""  
        def __init__(self, damage=30, life=100, enemy="Hero"):  
            #And keep defining the class and its methods and attributes in common with all the enemys
    
    class Trolls(object):  
         """Trolls!"""
         def __init__ (self, defense=1, shield=20):  
             #And define the specific attributes and methods for Trolls.  
    
    class SuperTroll(Enemy, Trolls):
    

我看到第一个是简单的,让我可以更灵活地创建具有共享方法和属性的多个类。但第二个似乎更容易使用(或者至少我喜欢它),我可以随心所欲地摆脱if条件。并且第三个可以用于混合不同类而没有任何共享方法或属性,并且如果它们共享它不会弄乱它(或者它会?)。

哪一个更好?
但是关于以一种或另一种方式写作,似乎只是关于你如何想要你的代码的策略问题。 这是正确的吗?

3 个答案:

答案 0 :(得分:2)

First one:

适当的方式......你继承了集体“ENEMY”。在这里,你可以拥有“ENEMY”在课堂下的共同点,并为所有类型的敌人提供单独的类,而且你也可以覆盖一些使某种“ENEMY”与众不同的方法。

Second one:

不好或适当的面向对象,因为如果“巨魔”有一些不被其他“敌人”共享的属性。您可能会说它可以使用“if”语句,但这会使代码更易于管理,这就是您使用OOP的原因(管理代码,这不仅仅是其中一个原因)。

Third one:

我强烈建议尽量不要使用多重继承。谷歌钻石死亡问题,你会知道为什么。多重继承的一条规则 - “如果你认为你需要多重继承,你可能就错了。如果你知道你必须使用多重继承,那么你可能是对的。”

答案 1 :(得分:2)

第二个例子不是一个好主意;它会导致大量重复的代码,每当你想出一种新的敌人角色时,你都必须编辑你的Enemy课程。

第一个和第三个之间的选择比较棘手,并且取决于你想要达到的目标(“战略问题”,就像你拥有它一样)。

来自EnemyTroll的{​​{1}}的第一个单一继承非常有用,因为它允许您定义所有Goblin字符将具有的所有代码,并且只定义EnemyTroll类中的差异。您可以进一步扩展它,并使Goblin继承自超类(或元类)Enemy,它为CharacterEnemy类提供了真正基本的东西(例如{ {1}},Hero,...)。

name

如果要分隔字符和角色,第三个示例可能很有用,例如:你可能有

health

class Enemy(Character)

class Troll(Enemy)

如果这些角色意味着不同的实例属性(例如class FriendlyTroll(Troll, Friend) 混合可能会引入class UnfriendlyTroll(Troll, Enemy) 方法)。这会让你的角色定义更加复杂,但是如果你不打算使用额外的功能,那么要解决这个问题需要很多复杂的工作,并且可能导致难以解决的多重继承问题。

TL; DR :使用第一个!如果您稍后决定确实需要将角色分离为混合类,那么这不是一项复杂的任务。

答案 2 :(得分:1)

嗯,类本质上描述了这些类的对象的行为的差异。那是你可以选择任何一种方法,但只有在你坐下来决定之后:

你的程序中一般来说,给定巨魔和敌人之间的区别是什么。如果存在这样的差异(即,有些情况下“巨魔”的行为与一般的敌人有所不同,或者有自己的方法(行动)等),那么你需要区分类Troll和类Enemy。如果他们的名字不同就是他们的名字,那么你可能不需要一个单独的班级......

只有在需要混合两个不相关类的行为时,才需要多重继承(第三种情况)。一般来说,这是一个艰难的方式,有一些陷阱和陷阱。但如果你足够聪明和准确,那么你可能会成功。