Python 如何在类定义中调用类函数? 类元数据: 最大尺寸=2**10 类定义代码 如果不存在os.path.exists'sample.data': SSD=打开“样本数据”,“wb+” 数据={ 0: [], 1:{'.':无,} } 数据[1]['~']=数据[1] MetaData.save我想在这里调用save函数 类函数 @类方法 def savecls: cls.SSD.seek0 cls.SSD.writeb'*cls.maxSize cls.SSD.seek0 cls.SSD.writepickle.dumpscls.data

Python 如何在类定义中调用类函数? 类元数据: 最大尺寸=2**10 类定义代码 如果不存在os.path.exists'sample.data': SSD=打开“样本数据”,“wb+” 数据={ 0: [], 1:{'.':无,} } 数据[1]['~']=数据[1] MetaData.save我想在这里调用save函数 类函数 @类方法 def savecls: cls.SSD.seek0 cls.SSD.writeb'*cls.maxSize cls.SSD.seek0 cls.SSD.writepickle.dumpscls.data,python,class,oop,class-method,class-members,Python,Class,Oop,Class Method,Class Members,我想在类块中使用save函数。我尝试了MetaDate.save并简单地保存这两个抛出错误的文件 有没有办法做到这一点 编辑 是的,maxSize是一个类变量,是的,我可以使用cls.maxSize访问它。在调用save时,该类尚未定义。解决此问题的一种方法是使用继承并在基类中定义save: class B: @classmethod def save(cls): print("Saving") class A(B): B.save(

我想在类块中使用save函数。我尝试了MetaDate.save并简单地保存这两个抛出错误的文件

有没有办法做到这一点

编辑


是的,maxSize是一个类变量,是的,我可以使用cls.maxSize访问它。

在调用save时,该类尚未定义。解决此问题的一种方法是使用继承并在基类中定义save:

class B:
    @classmethod
    def save(cls):
        print("Saving")

class A(B):
    B.save()
当然,在B.save中,A头部的变量是未知的,必须作为参数来保存

嗯,或者像这样:

class B:
    SSD = None

    @classmethod
    def save(cls):
        print(f"Saving {cls.SSD}")

class A(B):
    B.SSD = 3.14

    B.save()
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 B:
    SSD = None

    @classmethod
    def save(cls):
        print(f"Saving {cls.SSD}")

class A(B):
    B.SSD = 3.14

    B.save()
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
这是另一个答案

您可以使用元类来解决无法在类主体中引用该类的限制,因为该类尚不存在。您可以在元类新方法中创建该类,然后修改它——在本例中,通过调用其中定义的classmethod。我的意思是:

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)
第一次运行时产生的输出,即当没有预先存在的sample.data文件时:


请注意,SSD class属性是一个打开的文件-这很奇怪,但如果代码是可运行的,它也会这样做。

此外,SSD不是成员,因此cls.SSD不起作用。它也不是类函数,它是一个实例函数,其中通常引用的self参数已被重命名。为了使函数成为类函数,您应该添加decorator@classmethod,但您的代码仍然无法工作,除非您出于某种原因实际需要一个类,否则您可能需要更接近的类。为什么需要一个单独的类?只要把B.save放在类定义后面,done.true,@deceze,仔细想想,我通常会避免在类头中简单赋值静态变量以外的任何代码,然后将所有逻辑放入类方法中,如你所说,然后调用它来完成初始化。。。或者过度考虑设计,避免过多的静态内容。