【问题标题】:Basic OOP - 'str' object has no attribute 'age'基本 OOP - 'str' 对象没有属性 'age'
【发布时间】:2021-01-25 20:12:14
【问题描述】:

我正在尝试执行一些基本的 OOP 命令,此代码在我直接输入属性名称时有效,但在我尝试从用户输入中获取时无效

print('Hello, welcome')

class ManCity:

    def __init__(self, name, age, position):
        self.name = name
        self.age = age
        self.position = position

    def getName(self):
        print(self.name)

    def getAge(self):
        print(self.age)

    def getPosition(self):
        print(self.position)


aguero = ManCity('Sergio Aguero', 32, 'Striker')
sterling = ManCity('Raheem Sterling', 27, 'Winger')
jesus = ManCity('Gabriel Jesus', 24,'Striker')
dias = ManCity('Ruben Dias', 29, 'Centre Back')
stones = ManCity('John Stones', 26, 'Centre Back')
ederson = ManCity('Ederson', 29,'GoalKeeper')

chosenName = input(str('Choose Player'))
ManCity.getAge(chosenName)

【问题讨论】:

  • ManCity.getAge() 的参数必须是 ManCity 实例。 chosenName 是一个字符串。
  • 如果您尝试键入变量名,那将不起作用。 input() 不会评估您输入的变量,它只是一个文字字符串。
  • ManCity.getAge(chosenName) 是错误的。你为什么将chosenName 传递给.getAge
  • 如果您希望能够按名称查找ManCity,请创建一个从名称映射到实例的字典。或者你可以将它们全部放在一个列表中,并通过任何属性进行搜索。

标签: python python-3.x oop


【解决方案1】:

您需要检查每个实例的chosenName,例如

class ManCity:

    def __init__(self, name, age, position):
        self.name = name
        self.age = age
        self.position = position

    def getName(self):
        print(self.name)

    def getAge(self):
        print(self.age)

    def getPosition(self):
        print(self.position)


aguero = ManCity('Sergio Aguero', 32, 'Striker')
sterling = ManCity('Raheem Sterling', 27, 'Winger')
jesus = ManCity('Gabriel Jesus', 24,'Striker')
dias = ManCity('Ruben Dias', 29, 'Centre Back')
stones = ManCity('John Stones', 26, 'Centre Back')
ederson = ManCity('Ederson', 29,'GoalKeeper')

chosenName = input(str('Choose Player'))
# You can iterate over the created objects
for e in [aguero, sterling, jesus, dias, stones, ederson]:
    # for each object you will check if the name is same or not
    if(e.name == chosenName):
        print(e.getAge())

【讨论】:

  • 非常感谢,这是我尝试学习 OOP 的第一天,但​​现在更有意义了!
  • @AliAltaraif 太棒了!一切顺利。但不要忘记接受答案,以免它再次弹出:)
【解决方案2】:

正如@Barmar 所建议的,您可以创建一个从名称映射到实例的字典。这样可以非常快速地查找相应的实例,并检查它的名称是否在字典中。

这是一个这样做的例子。字典名为players。请注意,它将玩家姓氏的小写版本映射到每个Player 实例(并在处理之前将用户的输入转换为小写)。

print('Hello, welcome')

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

    def getName(self):
        print(self.name)

    def getAge(self):
        print(self.age)

    def getPosition(self):
        print(self.position)

    def __repr__(self):
        return f'{type(self).__name__}({self.name!r}, {self.age}, {self.position})'


# Create dictionary mapping players to their lowercase last name.
players = {}
for player in (ManCity('Sergio Aguero', 32, 'Striker'),
               ManCity('Raheem Sterling', 27, 'Winger'),
               ManCity('Gabriel Jesus', 24,'Striker'),
               ManCity('Ruben Dias', 29, 'Centre Back'),
               ManCity('John Stones', 26, 'Centre Back'),
               ManCity('Ederson', 29, 'GoalKeeper')):
    players[ player.name.split()[-1].lower() ] = player

while True:
    chosenName = input('Choose Player: ').lower()
    if chosenName.strip() == '':
        break  # Quit loop.
    if chosenName in players:
        print('Player info:', players[chosenName])
    else:
        print('Unknown name, try again')

使用示例:

Hello, welcome
Choose Player: Ederson
Player info: ManCity('Ederson', 29, GoalKeeper)
Choose Player: dias
Player info: ManCity('Ruben Dias', 29, Centre Back)
Choose Player:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2015-09-11
    • 2016-09-20
    • 2019-03-25
    • 2017-05-13
    相关资源
    最近更新 更多