__init__和类变量的设置

时间:2012-12-03 13:53:49

标签: python variables inheritance

我在理解类中的继承方面遇到了一些麻烦,并想知道为什么这些python代码不起作用,有人能告诉我这里出了什么问题吗?

## Animal is-a object 
class Animal(object):
    def __init__(self, name, sound):
        self.implimented = False
        self.name = name
        self.sound = sound

    def speak(self):
        if self.implimented == True:
            print "Sound: ", self.sound

    def animal_name(self):
        if self.implimented == True:
            print "Name: ", self.name



## Dog is-a Animal
class Dog(Animal):

    def __init__(self):
        self.implimented = True
        name = "Dog"
        sound = "Woof"

mark = Dog(Animal)

mark.animal_name()
mark.speak()

这是通过终端的输出

Traceback (most recent call last):
  File "/private/var/folders/nd/4r8kqczj19j1yk8n59f1pmp80000gn/T/Cleanup At Startup/ex41-376235301.968.py", line 26, in <module>
    mark = Dog(Animal)
TypeError: __init__() takes exactly 1 argument (2 given)
logout

我试图让动物检查动物是否已实施,然后如果是,请从动物继承的类来设置动物然后能够操作的变量。

3 个答案:

答案 0 :(得分:6)

katrielalex很好地回答了你的问题,但我也想指出你的课程有点差 - 如果没有错误 - 编码。关于你使用课程的方式似乎很少有误解。

首先,我建议您阅读Python文档以获得基本想法:http://docs.python.org/2/tutorial/classes.html

要创建一个类,只需执行

class Animal:
    def __init__(self, name, sound): # class constructor
        self.name = name
        self.sound = sound

现在您可以通过调用a1 = Animal("Leo The Lion", "Rawr")左右来创建名称对象。

要继承一个类,你可以:

# Define superclass (Animal) already in the class definition
class Dog(Animal):

    # Subclasses can take additional parameters, such as age
    def __init__(self, age):

        # Use super class' (Animal's) __init__ method to initialize name and sound
        # You don't define them separately in the Dog section
        super(Dog, self).__init__("Dog", "Woof")

        # Normally define attributes that don't belong to super class
        self.age = age

现在你可以通过说Dog来创建一个简单的d1 = Dog(18)对象而你不需要使用d1 = Dog(Animal),你已经告诉班级它的超类是{{1} }在第一行Animal

答案 1 :(得分:5)

  1. 要创建一个类的实例

    mark = Dog()
    

    不是mark = Dog(Animal)

  2. 不要这样做implimented。如果您想要一个无法实例化的类(即必须先进行子类化),请执行

    import abc
    class Animal(object):
        __metaclass__ = abc.ABCMeta
    
        def speak(self):
            ...
    

答案 2 :(得分:1)

由于给定示例中的age不是parent(或 base )类的一部分,因此必须实现该函数(在类中称为 method )在继承的类中(也称为派生的类)。

class Dog(Animal):

    # Subclasses can take additional parameters, such as age
    def __init__(self, age):
        ... # Implementation can be found in reaction before this one

    def give_age( self ):
        print self.age