在回答最近的一个问题时,我重复了我的假设,即使用的一个原因@staticmethod是节省内存,因为静态方法只实例化一次。这个断言可以很容易地在网上找到,(例如这里),我不知道我第一次遇到它。
我的推理基于两个假设,其中一个是错误的:python在实例化一个类时实例化了所有方法(事实并非如此,稍加思考就会发现,哎呀)和b。静态方法没有在访问时实例化,而是直接调用。因此我认为这段代码:
import asyncio
class Test:
async def meth1():
await asyncio.sleep(10)
return 78
t1= Test()
t2 = Test()
loop = asyncio.get_event_loop
loop.create_task(t1)
loop.create_task(t2)
def main():
for _ in range(10):
await asyncio.sleep(2)
loop.run(main())
Run Code Online (Sandbox Code Playgroud)
比我这样定义类会使用更多的内存:
class Test:
@staticmethod
async def meth1():
await asyncio.sleep(10)
return 78
Run Code Online (Sandbox Code Playgroud)
是这样吗?静态方法会在访问时实例化吗?类方法会在访问时实例化吗?我知道在第二种情况和第一种情况下t1.meth1 is t2.meth1都会返回,但这是因为 python第一次实例化然后第二次查找它,或者因为在这两种情况下它只是查找它,或者因为在这两种情况下它都会得到静态方法的副本在某种程度上是相同的(我认为不是这样?)静态方法的副本似乎没有改变:但我不确定我对它的访问正在做什么。TrueFalsemeth1id
如果是这样的话,现实世界有理由关心吗?我在 micropython 代码中看到了大量的静态方法,其中异步代码中同时存在多个实例。我以为这是为了节省内存,但我怀疑我错了。我很想知道 micropython 和 Cpython 实现之间是否有任何区别。
编辑
我的想法是正确的,调用t1.meth1()and将在第一个实例中t2.meth1()绑定该方法两次,在第二个实例中绑定一次?