【问题标题】:Can't print an object from a class无法打印类中的对象
【发布时间】:2022-08-05 17:38:16
【问题描述】:

对不起,但我不久前才开始学习 python,我被困在这个程序代码中,我无法让它像它应该的那样工作。

class Dog():
    def __init__(self,name,breed,owner):
        self.name = name
        self.breed = breed
        self.owner = owner

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


mick = Person(\"Mick Jagger\")
dog = Dog(\"Stanley\",\"French Bulldog\",mick)
print(dog.owner)

我想得到狗的主人名字,但我得到的是:

= RESTART: C:/Coding Practice/Object Oriented Programming.py =
<__main__.Person object at 0x000002C5DFB02050>

帮助将不胜感激。

    标签: python class object printing


    【解决方案1】:

    您可以使用__str____repr__ 以更易于阅读的格式获取对象的所有属性。

    __str__(读作“dunder(双下划线)字符串”)和__repr__(读作“dunder-repper”(表示“表示”))都是返回的特殊方法基于对象状态的字符串.

    class Dog():
        def __init__(self,name,breed,owner):
            self.name = name
            self.breed = breed
            self.owner = owner
        
        def __str__(self):
            return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))
    
        
    class Person():
        def __init__(self,name):
            self.name = name
        
        def __str__(self):
            return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))
    
    mick = Person("Mick Jagger")
    dog = Dog("Stanley","French Bulldog", mick)
    print(dog.owner)
    

    字符串

    如果您打印一个对象,或将其传递给 format、str.format 或 str,则 如果一个字符串方法被定义,该方法将被调用,否则,代表将会被使用。

    代表

    代表方法由内置函数 repr 调用,是什么 当它评估一个表达式时,它会在你的 python shell 上回显 返回一个对象。

    【讨论】:

    • 不错不错:)
    【解决方案2】:

    当您分配self.owner = owner self.owner 存储所有者对象的引用时,您应该通过提及属性self.owner = owner.name 来访问名称值。

    class Dog():
        def __init__(self,name,breed,owner):
            self.name = name
            self.breed = breed
            self.owner_name = owner.name
    
    class Person():
        def __init__(self,name):
            self.name = name
    
    
    mick = Person("Mick Jagger")
    dog = Dog("Stanley","French Bulldog",mick)
    print(dog.owner_name)
    

    【讨论】:

    • 谢谢!这真的很简单,很容易理解!
    • @Elix 我很欣赏这是一个简单的版本,但我很好奇如果 Person 类在未来有另一个属性,例如年龄,那么你是要单独访问每个属性还是通过 self.owner = owner 然后 dog.owner.namedog.owner.age ?
    • 我不确定,我尝试创建一个年龄属性,但它只打印所有者的姓名,有没有办法解决这个问题?
    • 有另一个狗的实例变量,如self.owner_age,并将其分配给owner.age,如self.owner_age=owner.age,或者简单地将所有者对象存储为self.owner = owner,并引用dog.owner.age以使其简单dog.owner返回原始所有者对象和@987654334 @ 返回他的年龄。记住 self 指的是当前实例
    • @Elix 这就是我认为旧代码很好的原因,因为您不需要创建多个单独的分配。顺便说一句,“易于理解”的代码版本祝你好运。
    【解决方案3】:

    您应该将 __repr____str__ 方法添加到 Person 类。或者只是__repr__

    class Person:
        def __init__(self,name):
            self.name=name
        def __repr__(self)
            return str(self.name)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2018-03-01
      • 2016-03-13
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-17
      相关资源
      最近更新 更多