假设我有一个名为 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 = []
这样做的正确方法是什么?
我应该在图类中包含这些行,然后使用
在每个孩子中修改它们Figure.name = 'Circle'
......或者我应该在每个孩子身上创造它们吗?那么我如何使用常见的 myprint 功能呢?这样:
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
答案 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"
这就是你所需要的。如果属性不是到实例,但对于所有类实例都是相同的,只需在类上定义它们(此处为name
和description
)。在构造函数中只定义data
,因为[]
是可变的,您可能希望每个实例都是唯一的。
子类然后使用不同的值重新定义name
和description
。 myprint
个Figure
个实例将打印"Figure"
,而myprint
个Circle
个实例将打印"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