python:改变类的打印

z33*_*33m 7 python mysql printing class object

是否有可能在python中更改为类打印的内容.我知道如果我们提供__str__ __unicode__方法,我们可以改变打印类的实例的方式.但我想为一堂课做这件事

例如:

class A(object):
    def __str__(self):
        return 'hello'

a = A()
print a
Run Code Online (Sandbox Code Playgroud)

将打印hello.是否可以更改print A默认情况下打印的行为<class '__main__.A'>

更新:我想我也可以解释一下上下文.我正在尝试创建MySQL查询,我有表示表的类.这些表类中的每一个都有一个包含表名的类变量.所以我想要做的是能够将Class as参数传递给cursor.execute并在查询中替换表名.

Dev*_*rre 5

是的,通过提供元类.这是一个坏主意,因为元类不能很好地构成,而且它是神奇而混乱的.

>>> class A(type):
...     def __repr__(self):
...             return '<this is not a class!>'
...
>>> class B(object):
...     __metaclass__ = A
...
>>> print B
<this is not a class!>
Run Code Online (Sandbox Code Playgroud)

(你也可以改变__str__,这取决于这是什么的语义)


您更新了帖子以讨论从类生成SQL查询.而不是改变str(Class),为什么不使用Class.__name__(即你用它定义的名称),或者也许Class.table_name(即你为每个类定义的一些类属性)?能够传递类并使它们自动地工作为不是表单的表名<class 'foo.x'>可能会使代码的未来读者感到困惑,因为它不清楚这应该从上下文中起作用.读者必须记住涉及元类黑客攻击(一个相对罕见的东西,虽然不是在ORM中!)以及元类黑客做了什么.相比之下,只是通过Class.table_name而不是Class让事情变得非常明显.

  • @zeem Re:组合,使用两个不同的元类需要你创建一个继承自它们的新元类,如果它们不是要继承的话,它们可能效果不好.作为一般规则,类,特别是元类,并不意味着多次继承,并且这可以并且将会爆炸.Re:神奇/混乱,基本问题是人们希望`repr(SomeClass)`看起来像一个类的repr,如果你改变它,那就打破了这个期望.所以人们可能会看到一个班级,甚至不知道*这是一个班级. (3认同)