【问题标题】:Python, involving defining a class [closed]Python,涉及定义一个类[关闭]
【发布时间】:2014-04-18 20:33:37
【问题描述】:

我想解决这个问题:

编写一个包含以下内容的类 ContestResult 的定义:

•String 类型的实例变量获胜者,初始化为空字符串。

•String 类型的实例变量 second_place,初始化为空字符串。

•String 类型的实例变量third_place,初始化为空字符串。

•一个名为 set_winner 的方法,它有一个参数,它的值分配给实例变量winner。

•一个名为 set_second_place 的方法,它有一个参数,它的值分配给实例变量 second_place 。

•一个名为 set_third_place 的方法,它有一个参数,它的值分配给实例变量third_place。

•一个名为 get_winner 的方法,它没有参数,并返回实例变量 winner 的值。

•一个名为 get_second_place 的方法,它没有参数并返回实例变量 second_place 的值。

•一个名为 get_third_place 的方法,它没有参数并返回实例变量 third_place 的值。

这是我的代码:

class ContestResult():
    def __init__(self):
        self.winner= ""
        self.second_place= ""
        self.third_place= ""
    def set_winner(self,value):
        self.winner= value.set_winner
    def set_second_place(self,value):
        self.second_place= value_set_second_place
    def set_third_place(self,value):
        self.third_place= value.set_third_place
    def get_winner(self):
        return self.winner
    def get_second_place(self):
        return self.second_place
    def get_third_place(self):
        return self.third_place 

我收到此错误:

Exception occurred(<class 'AttributeError'>, AttributeError("'str' object has no attribute 'set_winner'",)

有人可以帮我解决这个问题吗?请和谢谢。

【问题讨论】:

  • 错误提示 a String 没有set_winner
  • @user2864740 除了它完美地描述了问题? “嘿,这里出了点问题,因为你试图打电话给str.set_winner,但它并不存在。”确实,它是一个类方法,而不是类本身,这是错误的,但这似乎很容易分裂。
  • @AdamSmith 我提供了该消息的友好翻译。出现错误是因为 set_winner 应用于 a String(又名“str”)。此信息可用于追溯问题 - 主要是,where 使用了 set_winner 以及 为什么 将其应用于字符串?
  • value.set_winner 你希望它做什么?

标签: python class methods


【解决方案1】:

一个正在将字符串传递给set_winner。这就是您看到错误的原因。

但是,您不需要在 Python 中创建 set_winnerget_winner 函数。对象的所有成员变量,在本例中为winner、second_place 和third_place,都是可公开访问的。如果你真的想要修改器和访问器,Pythonic 的做法是使用property

 class ContestResult(object):
   def __init__(self):
     self.__winner = ''

   @property
   def winner(self):
     return self.__winner

   @winner.setter
   def winner(self, value):
     print "I'm about to set the value of winner"
     self.__winner = value

现在当您想查看“获胜者”属性时:

   foo = ContestResult()
   foo.winner = "Frank"

它就像一个普通的成员变量一样工作。

【讨论】:

    【解决方案2】:

    def set_winner(self,value) 中,大概value 是一个字符串,对吧?你为什么打电话给value.set_winner

    self.winner = value
    

    请注意,这适用于您所有的set_s。

    【讨论】:

    • 谢谢!我不知道为什么我自己没有抓住它。
    【解决方案3】:

    除非您尝试修改属性的实际获取和设置方式,否则您真的不需要 Python 的所有这些。

    class ContestResult(object):
        def __init__(self, winner, second_place, third_place):
            self.winner = winner
            self.second_place = second_place
            self.third_place = third_place
    
    Stick = ContestResult("Foo", "Bar", "Eggs")
    Stick.second_place #gets "Bar"
    Stick.winner = "Clown" #sets Stick.winner
    

    Python 不是 Java :) 你不需要这些方法——再说一次,除非你要修改数据或装饰方法或其他东西。在这种情况下,您可以使用wheaties 概述的@property 语法——这样做,您仍然实际上并没有调用getset 方法,您只是在交互一种 Pythonic 方式并使用赋值。

    Stick.second_place = "Earl" #this will call the property setter
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      相关资源
      最近更新 更多