繁体   English   中英

将类的名称传递给函数,并在方法外部分配给类属性

[英]Pass the name of the class to a function, assign to a class attribute, outside of a method

Python 3.7:

我有一个类定义,其中基于类名称为类属性分配了一个值,并且该值在类内的装饰器中使用。

我正在寻找“当前正在定义的类”的代名词。

这是一个例子:

class MyClass:

    # NameError: name '__class__' is not defined
    class_logger = find_logger(__class__.__name__)

    # __init__ is not important
    def __init__(self):
        # This works!
        self.logger = find_logger(__class__.__name__)

    @mydecorator(class_logger)
    # mymethod is not important
    def mymethod(self):
        return 1

什么是“当前正在定义的类”的合适代词?

(这类似于如何在__init__中获取当前的Python类名,而不管“ self”的类如何? ,但是这里的问题是“在init的定义中”,当时是2.7。Python3。 x解决了这个问题。)

当类定义尚未完成评估时,不能保证类对象存在并且用户可以访问。 即使可以访问它,也可能无法对其进行初始化,以至于您无法对其做任何有用的事情。

就是说,您也许可以得到该类的名称。 __qualname__是保存类/函数/方法/描述符/生成器实例的限定名称的属性。 您应该能够从类的定义中访问它。

class Fred:
    print("Fred's qualname:", __qualname__)
    class Barney:
        print("Barney's qualname:", __qualname__)

结果:

Fred's qualname: Fred
Barney's qualname: Fred.Barney

如果您的类不是在文件级定义的,则可能需要进行一些字符串操作以将其名称与其余路径分开。 例如,将上面的示例更改为print("Barney's qualname:", __qualname__.rpartition(".")[-1])仅得到“ Barney”而不是“ Fred.Barney”。


尽管尽了最大的努力,但我找不到能明确确认__qualname__作为常规名称而非属性访问的有意义值的文档。 我不完全相信这是定义良好的行为,因此我认为我不能毫无保留地认可它用于生产质量的代码。

要在定义类名称时使用它,您还可以使用带有__prepare__方法的元类:

def find_logger(name):
    return name + '_logger'


class PrepareClassLogger(type):
    def __prepare__(name, bases, **kwargs):
        return {'class_logger': find_logger(name)}


class MyClass(metaclass=PrepareClassLogger):
    pass

print(MyClass.class_logger)  # MyClass_logger

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM