【问题标题】:Instantiate a class but don't call its __init__ method [duplicate]实例化一个类但不调用它的 __init__ 方法[重复]
【发布时间】:2026-01-12 05:40:02
【问题描述】:

我想知道是否有任何方法可以创建一个类的对象,但不要调用它的__init__ 方法:

看下面的代码:

>>> class test():
    def __init__(self):
        print("an object created of this class")


>>> a=test()
an object created of this class
>>> 

我想要一种方法来创建 test() 类的对象,但不要打印 an object created of this class

有什么办法吗?

更新: 假设我已经实现了这个类并实例化了它的20 对象,我需要它的__init__ 方法来处理所有这些对象。现在我想实例化一些新对象,但我不想再调用它的__init__ 方法了。有什么办法吗?

【问题讨论】:

  • 您的意思是一般地创建一个没有__init__ 的类,还是避免调用现有类的已经实现的__init____init__ 中的什么是您不希望在创建实例时发生的事情(如果是这种情况,为什么会在 __init__ 中发生这种情况)?
  • 我假设这是一个简化的示例,并且您的实际应用程序在 init 中隐藏了更多代码,我的建议是简单地添加一个额外的关键字参数初始化,如果它设置为 true 则返回而不是执行 init 的其余部分
  • @jonrsharpe 是的,这个__init__ 方法是一个已经实现的类的一部分,我在程序的其他部分需要它的print() 语句,我只是希望它没有呼吁一个特定的对象! (只是好奇)
  • 也许应该有一个verbose 参数来定义这些prints 是否发生,或者使用logging,或者......这样一个抽象的例子很难给出建议。
  • 更新并没有真正让事情变得更清楚 - 更具体的数字并不能真正澄清问题(另外,没有必要包含单独的“更新”部分,感兴趣的用户可以查看更改历史反正)。一般来说,如果__init__ 中有代码不需要运行来初始化类的所有实例,移动它

标签: python python-2.7 python-3.x


【解决方案1】:

@classmethod 可用于实现实例化对象的替代方法。所有实例都会调用__init__,但是可以在classmethod中运行额外的代码:

class Test():
    def __init__(self):
        pass

    @classmethod
    def make_test(cls):
        t = cls()
        print("an object created of this class")
        return t

tests = [Test.make_test()  for i in range(3)]
# an object created of this class
# an object created of this class
# an object created of this class

newtest = Test()

【讨论】:

  • +1 这很好地将实际初始化对象的代码与仅在初始化时执行的代码分开。
  • 谢谢,这是实现我的课程的最佳方式,我会使用它。但我认为 @chepner 的回答是我的问题的答案,所以我一直检查。跨度>
  • @chepner 说了什么。在 init 中调用副作用对我来说似乎不是一个好的设计,所以我不明白为什么有人会想要__init__ 调用中打印,除了在开发期间用于调试目的的临时打印。
【解决方案2】:

您可以直接调用__new__,但我认为您应该重新考虑一下__init__ 方法的设计。

>>> class A(object):
...   def __init__(self):
...     print "In __init__"
...
>>> a = A()
In __init__
>>> b = A.__new__(A)
>>> type(b)
<class '__main__.A'>

【讨论】: