我想知道是否有人知道某个特定原因(除了纯粹的风格)为什么以下语言这些语法来启动课程?
的Python:
class MyClass:
def __init__(self):
x = MyClass()
红宝石:
class AnotherClass
def initialize()
end
end
x = AnotherClass.new()
我无法理解为什么用于构造函数的语法和用于实际获取类实例的语法是如此不同。当然,我知道它并没有真正有所作为,但是,例如,在ruby中,使构造函数“new()”有什么问题?
答案 0 :(得分:5)
当您创建类的对象时,您所做的不仅仅是初始化它。你正在为它分配内存,然后初始化它,然后返回它。
另请注意,在Ruby中,new()
是一个类方法,而initialize()
是一个实例方法。如果您只是覆盖new()
,则必须首先创建对象,然后对该对象进行操作并返回它,而不是更简单的initialize()
,您可以在其中引用self
,因为内置的new()
已经为您创建了对象(或者在Ruby中,因此隐藏了self
)。
在Objective-C中,您实际上可以更清楚地看到发生了什么(但是更加冗长),因为您需要单独进行分配和初始化,因为Objective-C无法将参数列表从分配方法传递到初始化一:
[[MyClass alloc] initWithFoo: 1 bar: 2];
答案 1 :(得分:4)
实际上在Python中构造函数是__new__()
,而__init__()
是实例初始化器。
__new__()
是静态类方法,因此必须首先调用它,作为第一个参数(通常命名为cls
或klass
)它获取类。它创建对象实例,然后将其作为第一个参数(通常名为__init__()
)传递给self
,以及所有其余的__new__
参数。
答案 2 :(得分:0)
这很有用,因为在Python中,构造函数只是另一个函数。例如,我已经多次这样做了:
def ClassThatShouldntBeDirectlyInstantiated():
return _classThatShouldntBeDirectlyInstantiated()
class _classThatShouldntBeDirectlyInstantiated(object):
...
当然,这是一个人为的例子,但你明白了。从本质上讲,大多数使用你的类的人可能会认为ClassThatShouldntBeDirectlyInstantiated为你的类,并且没有必要让他们反思。以这种方式做事,你所要做的就是将工厂函数记录为它实例化的类,而不是混淆任何使用该类的人。
在像C#或Java这样的语言中,我有时会觉得制作这样的类很烦人,因为很难确定是应该使用构造函数还是某些工厂函数。我不确定Ruby中的情况是否也是如此。