当前位置: 首页 > 面试题库 >

如何为一个类定义__str__方法?

龙繁
2023-03-14
问题内容

在Python中,object该类充当所有(新样式)类的根超类。至少默认情况下,将strrepr应用于的任何子类的“类实例”object会产生相同的结果:

>>> class spam(object): pass
... 
>>> str(spam)
"<class '__main__.spam'>"
>>> str(spam) == repr(spam)

我想定义一个的子类object,例如fancyobject,它object在每种方式上都是相同的,除了对自身str和产生不同的输出:repr``fancyobject

>>> class ham(fancyobject): pass
...
>>> str(ham)
'ham'
>>> repr(ham)
"<class '__main__.ham'>"

有没有办法在Python中做到这一点?

PS:我知道__str__特殊的方法,但是据我了解,如果类A重写__str__,则仅当str在的实例上调用时才调用覆盖方法A,而不是在A自身上调用时。即:

>>> class A(object):
...     def __str__(self):
...         return 'from new __str__: ' + object.__str__(self)
... 
>>> str(A())
'from new __str__: <__main__.A object at 0x7f79c62a5310>'
>>> str(A)
"<class '__main__.A'>"

问题答案:

实际上,与对象实例相同的机制适用于类型。类型本身就是对象,因此可以通过调用
类型__str__()上的方法(称为“元类”)将它们转换为字符串。因此,您必须覆盖元类上的方法: ____str__()

class fancytype(type):
    def __str__(self):
        return self.__name__
class ham(object):
    __metaclass__ = fancytype
print ham

版画

ham


 类似资料:
  • 这是练习: 为编写特殊方法。 带输入的示例输出: 下面的代码是我想出来的,但是我收到了一个错误: 我想不出我错在哪了。

  • 类是用于描述事物的的属性和行为的,而 Go 语言中的结构体正好可以用于描述事物的属性和行为 所以在 Go 语言中我们使用结构体来定义一个类型 type Person struct { name string // 人的属性 age int // 人的属性 } // 人的行为 func (p Person)Say() { fmt.Println("my name

  • 我已经使用过,并且我知道JIT-编译器的基本技术以及为什么使用JIT-编译。 然而,我仍然没有发现JVM是如何决定JIT编译一个方法的,即“当正确的时间到来时JIT编译一个方法”。 (2)JVM如何将方法分为“非热”和“热”方法?执行次数?还要别的什么吗? (3)如果“hot”方法有特定的阈值(如执行次数),是否有Java标志()来设置此阈值?

  • 在这一节中,我们正式的定义一个类。首先我给出PHP语言的实现: <?php class myclass { public $public_var; private $private_var; protected $protected_var; public static $static_var; public function __construct()

  • 本文向大家介绍Python自定义一个异常类的方法,包括了Python自定义一个异常类的方法的使用技巧和注意事项,需要的朋友参考一下 如何实现自定义一个异常 python内置了许多异常类,为编写代码划定红线,才使调试代码时能及时发现错误。那么我们编写一个模块也可以为使用此模块者划定红线,来约束使用者可用哪些数据,这就需要自定义异常类型。 首先需要了的是自定义类是的父类: python说明文档中是这样

  • 我试图从前端获取一个Json对象。这代表了一个过程。课程有一个现场徽标,即课程的图像。在我的控制器中,我有以下方法: 在服务层中,我有压缩(在DB中放置图像时)和取消压缩(在将图像渲染回fend时)的逻辑: 当我通过POSTMAN将带有徽标字段的JSON作为图像文件发送时,我得到415错误-未支持的媒体类型。 我错在哪里?我想我需要更换我的控制器,但如何更换呢?我需要从JSON with Mult