首页 > 解决方案 > 在不实例化任何对象的情况下使用实例方法可能是危险的还是有用的?

问题描述

好吧,我最近开始学习 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?

我不确定这是否只是一种好奇心,或者这是否有用,或者这是否会产生内存泄漏......

任何答案将不胜感激。谢谢!

标签: pythonclassoopmemory-managementinstantiation

解决方案


您可以使用 a 来执行此操作staticmethod- 它不需要类实例,因此可以仅使用类来调用。

可以在类(例如 C.f())或实例(例如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 的垃圾收集器将删除实例(虽然不是立即删除),所以它不是内存泄漏


推荐阅读