"inheritable alternative constructors" 是什么?
What are "inheritable alternative constructors"?
我在这个答案中无意中发现了术语 "inheritable alternative constructors":
link 指向 classmethod
得到解释的地方。
其他编程语言也有这个功能吗?
使用任何具有 class 方法(或类似方法)的语言,您可以做的一件事是提供替代构造函数。下面是一个稍微做作的 Python3 示例:
class Color():
def __init__( self, red, green, blue):
self._red, self._green, self._blue = red, green, blue
@classmethod
def by_name( cls_, color_name ):
color_defs = {'white':(255,255,255), 'red':(255,0,0),
'green':(0,255,0),'blue':(0,0,255)}
return cls_( *color_defs[color_name] )
有了这个 class 你现在可以做 :
red = Color(255,0,0) # Using the normal constructor
# or
red = Color.by_name('red') # Using the alternative
在 Python 中,'by_name' 方法通常被称为工厂方法,而不是构造函数,但它使用普通的构造函数方法。
因为这个'by_name'方法只是一个class方法,也就是说你subclass它,class方法也是继承的-所以可以用在任何子class上:即它是可继承和可扩展的。
子class Python 中的一个示例,它扩展了上面的颜色 class,并扩展了构造函数和 'by_name'
class ColorWithAlpha( Color ):
def __init__(self, red, green, blue, alpha=1.0):
super().__init__(red,green,blue)
self._alpha = alpha
@classmethod
def by_name( cls_, color_name, alpha):
inst = super().by_name(color_name)
inst._alpha = alpha
return inst
red_alpha = ColorWithAlpha(255,0,0,0.5)
red2_alpha = ColorWithAlpha.by_name('red',0.5)
其他语言也有类似的替代构造函数(例如 C++ 允许基于参数类型的多个构造函数),并且这些方法都是可继承的(即 subclasses 也可以使用它们(或根据需要扩展它们).
我不能谈论其他语言,但我相信其他 OOP 语言将具有类似的 constructors/factory 方法功能。
一个Pythonclass只能有一个__init__()
方法,很多调用class构造函数,因为调用它来初始化class的实例当它们通过调用 class.
创建时
有时,使用其他替代方法来创建 class 的实例以及执行此操作的函数或方法可以统称为 替代构造函数。由于这些将在实例存在之前被调用,因此它们通常被实现为 classmethod
s 而不是独立函数。这也需要使用 class 名称(或 class 的实例)来使正在做的事情更加明显:即 MyClass.created_some_other_way()
像大多数方法一样,它们将被派生自定义它们的 class 的任何子 class 继承,因此可以统称为 可继承的替代构造函数 以强调其他情况下隐含的内容。
为了弄清楚问题的可继承部分,这里是第一个以不使用继承的方式重写的示例。
同样,这就是 'not' 你想要做的。
class Color():
def __init__( self, red, green, blue):
self._red, self._green, self._blue = red, green, blue
def by_name(color_name ):
color_defs = {'white':(255,255,255), 'red':(255,0,0),
'green':(0,255,0),'blue':(0,0,255)}
return Color( *color_defs[color_name] )
请注意,@classmethod
以及对 cls_
的引用都已消失。 return 语句直接调用 class、Color
的名称。
使用 @classmethod
可以使用更通用和继承友好的 cls_
.
来引用 Color
我在这个答案中无意中发现了术语 "inheritable alternative constructors":
link 指向 classmethod
得到解释的地方。
其他编程语言也有这个功能吗?
使用任何具有 class 方法(或类似方法)的语言,您可以做的一件事是提供替代构造函数。下面是一个稍微做作的 Python3 示例:
class Color():
def __init__( self, red, green, blue):
self._red, self._green, self._blue = red, green, blue
@classmethod
def by_name( cls_, color_name ):
color_defs = {'white':(255,255,255), 'red':(255,0,0),
'green':(0,255,0),'blue':(0,0,255)}
return cls_( *color_defs[color_name] )
有了这个 class 你现在可以做 :
red = Color(255,0,0) # Using the normal constructor
# or
red = Color.by_name('red') # Using the alternative
在 Python 中,'by_name' 方法通常被称为工厂方法,而不是构造函数,但它使用普通的构造函数方法。
因为这个'by_name'方法只是一个class方法,也就是说你subclass它,class方法也是继承的-所以可以用在任何子class上:即它是可继承和可扩展的。
子class Python 中的一个示例,它扩展了上面的颜色 class,并扩展了构造函数和 'by_name'
class ColorWithAlpha( Color ):
def __init__(self, red, green, blue, alpha=1.0):
super().__init__(red,green,blue)
self._alpha = alpha
@classmethod
def by_name( cls_, color_name, alpha):
inst = super().by_name(color_name)
inst._alpha = alpha
return inst
red_alpha = ColorWithAlpha(255,0,0,0.5)
red2_alpha = ColorWithAlpha.by_name('red',0.5)
其他语言也有类似的替代构造函数(例如 C++ 允许基于参数类型的多个构造函数),并且这些方法都是可继承的(即 subclasses 也可以使用它们(或根据需要扩展它们). 我不能谈论其他语言,但我相信其他 OOP 语言将具有类似的 constructors/factory 方法功能。
一个Pythonclass只能有一个__init__()
方法,很多调用class构造函数,因为调用它来初始化class的实例当它们通过调用 class.
有时,使用其他替代方法来创建 class 的实例以及执行此操作的函数或方法可以统称为 替代构造函数。由于这些将在实例存在之前被调用,因此它们通常被实现为 classmethod
s 而不是独立函数。这也需要使用 class 名称(或 class 的实例)来使正在做的事情更加明显:即 MyClass.created_some_other_way()
像大多数方法一样,它们将被派生自定义它们的 class 的任何子 class 继承,因此可以统称为 可继承的替代构造函数 以强调其他情况下隐含的内容。
为了弄清楚问题的可继承部分,这里是第一个以不使用继承的方式重写的示例。 同样,这就是 'not' 你想要做的。
class Color():
def __init__( self, red, green, blue):
self._red, self._green, self._blue = red, green, blue
def by_name(color_name ):
color_defs = {'white':(255,255,255), 'red':(255,0,0),
'green':(0,255,0),'blue':(0,0,255)}
return Color( *color_defs[color_name] )
请注意,@classmethod
以及对 cls_
的引用都已消失。 return 语句直接调用 class、Color
的名称。
使用 @classmethod
可以使用更通用和继承友好的 cls_
.
Color