Python子类定义

时间:2017-03-19 05:20:08

标签: python oop

我目前正在尝试个人项目以提高我的oop能力。基于我玩的游戏,我无法为损伤建模程序创建良好的类结构。

具体来说,我觉得我很难编写子类的太多方面。我已将问题简化为以下内容。我有一个名为gun的超类,其中包含游戏中任何枪支的基本元素。

class gun():

def __init__(self,critc,maxa):
    self.critc = critc
    self.maxa = maxa
    self.currentmag = maxa

def shoot(self):
    self.currentmag -= 1

现在我想创建一个特定的枪类而不实际实例化它。我的理由是,如果有100种类型的枪支,并非所有枪支子类都需要同时实例化。但是,我的所有枪类子类定义看起来非常相似,只有特定值的微小变化。是否有一种通用/简单的方法来清理它?

class gun1(gun):
    def __init__(self):
      self.critc = 10
      self.maxa = 20

class gun2(gun):
    def __init__(self):
      self.critc = 11
      self.maxa = 25

我想找到类似的东西:

class gun1(gun(10,11))

哪个实际上不可用,但很好地封装了我想要的内容。也就是说,使每个子类的定义简短,简洁,而不是多余。在上面的例子中,10是critc变量,11是maxa变量。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

根据Jakub已经说明的内容,您可以复制class并在不实例化的情况下更改其属性。

>>> class Gun():
...     critc = 0
...     maxa = 0
...     def __init__(self, critc=None, maxa=None):
...         if critc:
...             self.critc = critc
...         if maxa:
...             self.maxa = maxa
...         self.currentmag = maxa
...     def shoot(self):
...         self.currentmag -= 1
... 
>>> Kalashnikov = Gun
>>> Kalashnikov.critc = 15
>>> Kalashnikov.maxa = 40
>>> k = Kalashnikov(15, 40)
>>> k
<__main__.Gun instance at 0x7fcc0f482200>
>>> k.shoot()
>>> k.maxa
40
>>> k.currentmag
39
>>> AK47 = Gun
>>> AK47.critc = 30
>>> AK47.maxa = 30
>>> a = AK47()
>>> a.critc
30