【发布时间】:2015-11-10 14:24:24
【问题描述】:
我有一个由几个孩子继承的父类。我想使用父母的 @classmethod 初始化器初始化其中一个孩子。我怎样才能做到这一点?我试过了:
class Point(object):
def __init__(self,x,y):
self.x = x
self.y = y
@classmethod
def from_mag_angle(cls,mag,angle):
x = mag*cos(angle)
y = mag*sin(angle)
return cls(x=x,y=y)
class PointOnUnitCircle(Point):
def __init__(self,angle):
Point.from_mag_angle(mag=1,angle=angle)
p1 = Point(1,2)
p2 = Point.from_mag_angle(2,pi/2)
p3 = PointOnUnitCircle(pi/4)
p3.x #fail
【问题讨论】:
-
@classmethod和self?!这些并没有真正结合在一起。 -
类方法的第一个参数通常命名为
cls,以区别于实例self。您当然可以通过self访问类方法,但在这种情况下,您不清楚为什么要这样做,因为类方法设置了一个类属性。 -
您不能在
__init__中分配给self并期望它能够工作。如果类方法是备用构造函数,为什么不直接使用A10.from_half_a(5)? -
类方法调用
__init__,而不是相反。继承已经做了你想做的事,因为你在继承方法中使用了cls(...),而不是A(...)。 -
@alex 这不是意见问题!当您从类方法内部调用
cls(...)时,它会在cls代表的任何类上调用__init__(和/或__new__),从而创建一个新实例。 “我想要做的只是使用来自子类的父类的替代构造函数”,所以,再次,只需使用ChildClass.inherited_class_method(...)。参见例如stackoverflow.com/q/1015592/3001761, stackoverflow.com/q/1216356/3001761 为什么你不能分配给self。
标签: python inheritance class-method