【问题标题】:Under the Hood: How does calling x work after x = 1 [closed]引擎盖下:在 x = 1 之后调用 x 如何工作 [关闭]
【发布时间】:2021-02-09 20:24:09
【问题描述】:

所以,我分配 x = 1,2 然后调用它

x
>>> (1,2)
OR
some_function(x) is passed the tuple (1,2)

类中的什么方法或配置正在执行此操作?

我问是因为我想创建一个类“myclass”,当我调用一个实例时,该实例应该返回分配给它的值

当我问这个question another way 时,到目前为止的回答都是沿着创建方法的路线......但我不想使用 x.vals 从 x 中获取值,我只想使用 x .
这是怎么做的? ...而我真正想要的是类代码的示例,这样我就可以将它放在我的类中:)

哦,我们非常欢迎更好的标签建议。不懂行话让我在这里处于真正的劣势

【问题讨论】:

  • xprint(x) 均未致电 x。你想设置一个类的默认表示吗?
  • 如果你希望通过询问 SO 来学习 python - 你很快就会失望。这不是 SO 的目的。谷歌 python 教程,阅读关于类等的文档。
  • 如果你想让x从字面上评估为 (1, 2),这是不可能的,实际上甚至没有明确定义。 x 只是 myclass 的一些名称——就像方法中的 self 一样。如果对实例的任何引用立即解包该实例,则任何实例都不存在。
  • @PatrickArtner 是的,我注意到了这种影响。不幸的是,您必须先用正确的行话知道您想知道的内容,然后才能找到它。在树上寻找绿色的东西可能会返回叶子,但您实际上是在寻找青蛙……是的,这很浪费时间。此外,在我搜索类构造示例和关于类的 python 教程中,没有一个显示此示例
  • @MisterMiyagi 谷歌搜索“类的默认表示”建议不。我不想要字符串,我想要返回元组。

标签: python-3.x


【解决方案1】:

对象有两种方法来控制它们的显示:__str____repr__

__str__ 是“用户”表示,返回您在打印或调用str(obj) 时要查看的字符串。

__repr__ 是“程序员”表示。它应该返回一个有用的字符串 用于调试。 repr(obj) 调用此方法。理想情况下,eval(repr(obj)) 应该重新创建对象,但这不是必需的。

对于您的 x=1 示例,int 类定义了这些方法以返回整数的十进制数字字符串。

你的例子:

class myclass:

    def __init__(self,a,b):
        self.a = a
        self.b = b

    def __repr__(self):
        return f'myclass({self.a}, {self.b})'

    def __str__(self):
        return f'({self.a}, {self.b})'

m = myclass(1,2)
print(m)
print(repr(m))
n = eval(repr(m))
print(repr(n))
(1, 2)                   # from __str__
myclass(1, 2)            # from __repr__
myclass(1, 2)            # eval(repr(obj))

此外,如果 __str__ 未定义,str(obj)print(obj) 将调用 __repr__

参考:Basic Customization

【讨论】:

  • 嗨,马克,感谢您的回复。不过,我并不是要获取值的字符串表示形式,而是要获取元组。 some_function(x) 没有传递字符串,而是传递元组。这是如何实现的?
  • @DaftVader 只需在类中添加一个方法即可返回元组。例如:some_function(x.get_tuple()).
  • x = myclass(1,2) ...some_function(x) 不应该需要 some_function(x.get_tuple()) 我如何定义我的类以在调用实例时返回该元组?
  • @DaftVader 你不能。 xmyclass 对象,而不是 tuple 对象。你需要一个转换器函数。
【解决方案2】:

我希望我能很好地理解你的问题。试试这个:

>>> x = (1,2)
>>> def some_function(value):
...    print(type(value))
...    print(value[0])
...    print(value[1])
...
>>> some_function(x)
<type 'tuple'>
1
2

正如你提到的你想调用一个类方法,这里是方法版本:

>>> x = (1,2)
>>> class MyClass:
...    def some_method(self, value):
...        print(type(value))
...        print(value[0])
...        print(value[1])
...
>>> my_object = MyClass()
>>>
>>> my_object.some_method(x)
<type 'tuple'>
1
2
>>>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2012-10-03
    • 2011-04-07
    • 2013-04-08
    • 1970-01-01
    • 2012-12-30
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多