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?
我不确定这是否只是一种好奇心,或者这是否有用,或者这是否会产生内存泄漏......
任何答案将不胜感激。谢谢!
解决方案
您可以使用 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 的垃圾收集器将删除实例(虽然不是立即删除),所以它不是内存泄漏。
推荐阅读
- ios - Swift:在循环内更新标签
- javascript - 使用 Puppeteer、Mocha 和 Chai 在 html 标签属性中断言文本的存在
- java - 登录后 JSessionId 发生变化,Angular 5 正在发送带有请求的新 JSessionID 并丢弃旧的 jsessionid
- javascript - 如何从另一个函数返回“addEventListener()” - Javascript
- angular - 使用指令设置元素焦点
- python - fit_transform 运行算法前的数据
- docker - docker-compose up 不绑定端口
- r - 折叠一列中因子变量的水平,同时对另一列中的计数求和
- java - 目录中的 Gradle fatjar
- python - OpenGL中的太阳系,相机位置