使用实例方法而不实例化任何对象可能是危险的或有用的?

2024-10-03 06:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

嗯,我最近开始研究Python,但是我发现,由于语言的工作方式,我可以做一些我不知道它会有什么样的连续性的事情

举个例子:

class crazyClass:
    def __init__(self):
        self.name = "Crazy Class"  # Irrelevant, just to have something

    def madnessUnleashed(self):
        print("WAJALAKAMAKACHAKA!")

# Now I want to use madnessUnleashed
# But I don't want to instantiate any object.

crazyClass.madnessUnleashed(crazyClass())  # Damn, I'm instantiating an object, but is it temporary or what?

我不确定这是否仅仅是一种好奇,或者这是否有用,或者这是否会导致内存泄漏

任何回答都将不胜感激。谢谢


Tags: tonameself语言objectinitdef方式
2条回答

它不会产生任何内存泄漏。从创建对象的行开始,事情按以下顺序发生:

  1. crazyClass的新实例被创建
  2. madnessUnleashed被作为静态方法调用,因此self在本例中是之前创建的对象
  3. python的垃圾收集器检查对象是否仍然被引用(不是),并将其从内存中移除

基本上没有什么特别的事情发生。 您可以在这里阅读有关垃圾收集器的更多信息:https://rushter.com/blog/python-garbage-collector/

您可以使用^{}来实现这一点—它不需要类实例,因此可以仅使用类来调用

A static method can be called either on the class (such as C.f()) or on an instance (such as C().f()).

将其用作方法上的装饰器:

class crazyClass:
    def __init__(self):
        self.name = "Crazy Class"

    @staticmethod
    def madnessUnleashed():  # there's no `self`
        print("WAJALAKAMAKACHAKA!")


crazyClass.madnessUnleashed()  # no instance created

在一个类中有一个普通方法的例子中,crazyClass.madnessUnleashed(crazyClass())实际上创建了一个类的实例,这可以看作是一种开销。如果实例化它涉及到文件创建、网络请求、数据库连接等,或者如果在数以百万计的循环中使用它们,那么它可能会对性能产生更高的影响,重复创建这些实例将影响性能

至于您关于内存泄漏的问题:一旦方法执行完毕,Python的垃圾回收器将删除该实例(尽管之后不会立即删除),因此它不是内存泄漏

相关问题 更多 >