[英]How do I call a class function inside the class definition?
class MetaData():
maxSize = 2**10
# class definition code
if not os.path.exists('sample.data'):
SSD = open('sample.data', 'wb+')
data = {
0: [],
1: {'.': None,}
}
data[1]['~'] = data[1]
MetaData.save() # i want to call the save function here
# class function
@classmethod
def save(cls):
cls.SSD.seek(0)
cls.SSD.write(b' ' * cls.maxSize)
cls.SSD.seek(0)
cls.SSD.write(pickle.dumps(cls.data))
我想在 class 块内使用save()
function 。 我试过MetaDate.save()
和简单地save()
两者都抛出错误
有什么办法可以做到这一点?
编辑
是的, maxSize
是一个 class var,是的,我可以使用cls.maxSize
访问它。
您的问题与我曾经问过的问题非常相似 — 在 class 正文中调用 class 静态方法? — 这很有趣,因为这意味着您可以将其改为 static 方法并像这样调用它:
import os
import pickle
class MetaData:
maxSize = 2**10
@staticmethod
def save():
SSD.seek(0)
SSD.write(b' ' * cls.maxSize)
SSD.seek(0)
SSD.write(pickle.dumps(cls.data))
# class definition code
if not os.path.exists('sample.data'):
SSD = open('sample.data', 'wb+')
data = {
0: [],
1: {'.': None,}
}
data[1]['~'] = data[1]
save.__func__() # Call the save function
这是另一个答案。
您可以使用元类来解决无法在 class 正文中引用 class 的限制(因为 class 尚不存在)。 您可以在元类__new__()
方法中创建 class 然后修改它——在这种情况下,通过调用其中定义的类方法。 这就是我的意思:
import os
import pickle
class MetaMetaData(type):
def __new__(meta, classname, bases, classdict):
cls = type.__new__(meta, classname, bases, classdict)
if not os.path.exists('sample.data'):
cls.SSD = open('sample.data', 'wb+')
cls.data = data = {
0: [],
1: {'.': None,}
}
data[1]['~'] = data[1]
cls.save()
return cls
class MetaData(metaclass=MetaMetaData):
maxSize = 2**10
@classmethod
def save(cls):
cls.SSD.seek(0)
cls.SSD.write(b' ' * cls.maxSize)
cls.SSD.seek(0)
cls.SSD.write(pickle.dumps(cls.data))
# class definition code
...
if __name__ == '__main__':
print(MetaData.data)
Output 第一次运行(即没有预先存在的sample.data
文件时)产生:
{0: [], 1: {'.': None, '~': {...}}}
请注意, SSD
class 属性是一个打开的文件——这很奇怪,但如果它是可运行的,这也是你的代码会做的事情。
在您调用save
时,class 尚未定义。 解决此问题的一种方法是使用 inheritance 并在基类中定义save
:
class B:
@classmethod
def save(cls):
print("Saving")
class A(B):
B.save()
然后,当然, A
头部的变量在B.save
中是未知的,必须以 arguments 的形式给出才能save
。
好吧,或者像这样:
class B:
SSD = None
@classmethod
def save(cls):
print(f"Saving {cls.SSD}")
class A(B):
B.SSD = 3.14
B.save()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.