Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使python对象在直接调用时返回属性数据_Python_Object_Call - Fatal编程技术网

如何使python对象在直接调用时返回属性数据

如何使python对象在直接调用时返回属性数据,python,object,call,Python,Object,Call,因此,我想在Python中实现如下内容: class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return self.name, self.age p = Person('A', 20) 然后希望直接调用对象p以获得元组(self.name、self.age) 但正如您在运行此程序时所看

因此,我想在Python中实现如下内容:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return self.name, self.age

p = Person('A', 20)
然后希望直接调用对象p以获得元组(self.name、self.age)

但正如您在运行此程序时所看到的,您会遇到以下问题:

TypeError: __repr__ returned non-string (type tuple)
怎么会有这种行为

谢谢


注意:问题不特定于元组数据类型;它可以是任何东西,比如熊猫数据帧。我只想返回一些属性数据,不管它是什么类型。

正如错误所提示的,您的
\uuuu repr\uuu
必须返回一个字符串

def __repr__(self):
    return self.name + str(self.age)

现在,如果您的目标是编写一种将对象表示为元组的自定义方式,那么您需要的是
\u iter\uuu

def __iter__(self):
    yield self.name
    yield self.age

p = Person('A', 20)
print(tuple(p))
>>>>('A', 20)

由于
\uuuuu repr\uuuuuu
应该返回一些类似于有效Python表达式的内容,因此您可以选择实现
\uuuuuu str\uuuuuu
(即使此实现满足这两个目的):

更新:如果实际需要元组,只需使用非预定义例程:

def get_attributes(self):
    return self.name, self.age

再加上,也许你正在寻找一个名为tuple的
-它将为你提供你想要的:

from collections import namedtuple
Person = namedtuple('Person', 'name, age')

因此,基本上每次创建一个人时都会得到一个元组(你会得到解包之类的东西)-但是,对象person是不可变的,不确定这是否就是你在这里拍摄的目的。

你可以使
person
可编辑:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __iter__(self):
        yield self.name
        yield self.age

name, age = p

另一个选项是使类实例可调用,并在调用时返回所需的元组。例如

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f'Person({self.name}, {self.age})'

    def __call__(self):
        return self.name, self.age

p = Person('A', 20)
print(p)
t = p()
print(t, type(t))
输出

Person(A, 20)
('A', 20) <class 'tuple'>
人(A,20)
('A',20)

您想将
(self.name,self.age)
作为字符串还是实际元组?是的。我希望我是一个真正的元组。不是字符串。这是实际
Person
类的完整定义,还是还有其他方法?如果不需要方法,可以使用namedtuple或新的dataclass。这是我问题的简化模型。它不是特定于元组数据类型的,但可以是任何类似于数据帧的数据。重要的是我想发现的概念:当直接调用对象(而不是返回其内存地址)时,如何实际返回属性数据@mctrjalloh好的,但直接调用是什么意思,这是什么?一旦需要真正的方法,这个建议就不再适用,比如
is_of_age()
,这取决于他在找什么。“然后希望直接调用对象p来获取元组(self.name,self.age)”我想返回元组本身,或者返回对象属性中可用的任何数据。但不是字符串表示。这只是一次尝试。@mctrjalloh只是想确保我正确理解了你的问题,请你详细说明一下直接打电话是什么意思。当你使用
p()
时,你想返回一个元组吗?现在让我们说,我想返回的不是元组而是熊猫数据帧…@mctrjalloh你仍然没有回答你所说的直接调用。不。只需在不带括号的情况下交替键入p,
def\uu iter\uuu(self):
yield from(self.name,self.age)
取决于您的意思。
Person
迭代器连续生成其名称和年龄;这是一个单独的问题。@mctrjalloh如果你想要一个数据帧,为什么要使用类呢?只需创建一个函数,该函数接受所需的参数并返回所需的数据帧。
Person(A, 20)
('A', 20) <class 'tuple'>