gpt4 book ai didi

python - python 类的 Str 方法重构类源

转载 作者:太空宇宙 更新时间:2023-11-03 18:21:36 24 4
gpt4 key购买 nike

如何为类配备 __str__ 方法,该方法打印类本身的源代码排除方法定义

我排除方法定义,因为我的用例是我动态生成固定装置(使用 fixtures 包;这与 django 固定装置不同),并且我想存储这些文件中的固定装置。对于那些不知道的人,fixtures 包使用 python 类来表示 fixture 数据。

这似乎是一种甚至可以内置到固定装置中的东西,因为在我看来,这将是一个相当常见的用例。

最佳答案

您可以使用元类来做到这一点。这里我省略了私有(private)(以下划线开头)和可调用对象(方法、内部类等)。仅包含直接在类上定义的属性(基类已正确列出,因此这不应该成为问题)。

class ClassSourceMeta(type):
def __str__(cls):
return "class %s(%s):\n\n%s\n" % (cls.__name__,
", ".join(k.__name__ for k in cls.__bases__),
"\n".join(" %s = %r" % (k, v) for (k, v) in
cls.__dict__.items() if not (k.startswith("_") or callable(v))))
__repr__ = __str__

class Mine(object):
__metaclass__ = ClassSourceMeta
a = 42
b = 13

print(Mine)

在 Python 3 中,您需要以另一种方式指定元类:

class Mine(metaclass=ClassSourceMeta):
a = 42
b = 13

请注意,属性需要具有合理的 repr() s。如果它们是类实例,您最终可能会得到语法无效的内容,例如 a = <__main__.Mine object at 0x02AA4870>除非你写得好__repr__方法给他们。对于数字和字符串等基本内容,甚至列表和字典,您都可以使用。

另请注意,属性不一定按照定义的顺序出现;属性存储在dict中它不保留插入顺序。不过,Python 不会在意。

如果fixtures模块已经使用了元类,您可能需要继承它而不是 type ,或者猴子修补他们的元类。在 Python 2.x 上,这需要为 __str__ 制作一个方法包装器。类:

from types import MethodType

def __str__(cls):
return "class %s(%s):\n\n%s\n" % (cls.__name__,
", ".join(k.__name__ for k in cls.__bases__),
"\n".join(" %s = %r" % (k, v) for (k, v) in
cls.__dict__.items() if not (k.startswith("_") or callable(v))))

MetaclassToPatch.__str__ = MethodType(__str__, None, MetaclassToPatch)
MetaclassToPatch.__repr__ = MetaclassToPatch.__str__

关于python - python 类的 Str 方法重构类源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com