在父类中使用打印功能,关于'继承'的定义。变量

时间:2016-10-25 11:28:17

标签: python python-3.x inheritance

假设我有一个名为 figure 的父类:

class Figure:
    def __init__(self):        
        self.name = " "
        self.description = " "
        self.data = []


    def myprint(self):
        # Print all variables in a special way

我想创建这个类的几个子元素(圆形,矩形......),我想尽可能多地使用继承。这就是为什么我要创建一个 myprint 函数,它输出所有孩子共有的所有数据,即这一个:

        self.name = " "
        self.description = " "
        self.data = []

这样做的正确方法是什么?

  1. 我应该在类中包含这些行,然后使用

    在每个孩子中修改它们
    Figure.name = 'Circle'
    
  2. ......或者我应该在每个孩子身上创造它们吗?那么我如何使用常见的 myprint 功能呢?这样:

  3. class Figure:
            def __init__(self):        
    
            def myprint(self):
                # Print all variables in a special way
    
    class Cricle(Figure):
            def __init__(self, radius):        
                name='Circle'
                pass
    

2 个答案:

答案 0 :(得分:1)

class Figure:
    name = 'Figure'
    description = "I'm a figure"

    def __init__(self):
        self.data = []

    def myprint(self):
        print(self.name, self.description, self.data)


class Circle(Figure):
    name = 'Circle'
    description = "I'm a circle"

这就是你所需要的。如果属性不是到实例,但对于所有类实例都是相同的,只需在类上定义它们(此处为namedescription)。在构造函数中只定义data,因为[]是可变的,您可能希望每个实例都是唯一的。

子类然后使用不同的值重新定义namedescriptionmyprintFigure个实例将打印"Figure",而myprintCircle个实例将打印"Circle"。这是因为self.name引用了当前对象的name属性,并且该值将根据它是Figure还是Circle而有所不同。

答案 1 :(得分:1)

您在__init__中定义的所有内容都是实例变量。 我想你正在寻找类变量,或者更确切地说是常量完全相同的常量,但按惯例用所有大写字母写。 另外,请查看__str__方法here。 因此,正确的方法是:

class Figure:
    NAME = "Figure"

    def __str__(self):
        """ override me """
        return "I am a {name} and have the default __str__".format(name=self.NAME)

class Circle(Figure):
    NAME = "Circle"

    def __init__(self, x, y, r):
        self.x, self.y, self.r = x, y, r

    def __str__(self):
        return "I am a {name} at ({x}, {y}) with radius {r}".format(
            name=NAME, x=self.x, y=self.y, r=self.r)

现在你需要做的就是运行正确的输出

f = Figure()
c = Circle(1, 2, 3)
print(f)
print(c)

将输出

I am a Figure and have my __str__ not overwritten
I am a Circle at (1, 2) with radius 3