如何使用“__str__”方法?

7 投票
4 回答
13691 浏览
提问于 2025-04-17 18:26

我正在学习面向对象编程。不过,我连第一步都搞不定:使用 __str__ 把类转换成字符串。

这是我的代码:

class Time:

    def __init__(self, hours = 0, minutes = 0, seconds = 0):
        self.hours = hours
        self.minutes = minutes
        self.seconds = seconds

    def __str__(self):
        return "basdfadsg"



time1 = Time

time1.hours = 3
time1.minutes = 23
time1.seconds = 13

print(time1)

每次我尝试:

print(time1)

它返回:

<class '__main__.Time'>

我哪里出错了?

4 个回答

1

你的问题在这里:

time1 = Time

你没有创建一个时间类(Time)的实例并把它传给time1,而是把这个类的类型传给了time1。

要让这段代码按你想要的方式工作,只需要调用对象构造函数:

time1 = Time()

你可能会想:“为什么会有人需要一个变量来保存类型而不是实例呢?”其实在Python中,类的定义(以及几乎所有其他东西)都是一等对象,可以在运行时被修改,这样就可以动态地添加或移除类定义中的成员和成员函数。好好享受编程的乐趣吧,真的很有意思。

2

如果你真的想为一个类和这个类的实例分别定义 __str____repr__ 方法,你需要用元类来实现,像这样:

>>> class Test(type):
...    def __repr__(self):
...       return 'Test is my name'
... 
>>> class MT(object):
...    __metaclass__=Test
... 
>>> print MT
Test is my name

不过,正如其他人所说的,你更可能是没有正确地引用 Time 的实例,而是在调用 __init__ 方法。

11

你需要一个 实例,也就是要创建一个 Time 的对象。例如,你可以这样写 time1 = Time() (注意后面的括号)。

现在你做的其实是在修改这个 ,而不是这个类的 实例。而 __str__ 只是告诉 Python 如何从类的实例创建字符串,而不是从类本身创建字符串……

撰写回答