NameError:名称“”未定义[关闭]
Posted
技术标签:
【中文标题】NameError:名称“”未定义[关闭]【英文标题】:NameError: name "" is not defined [closed] 【发布时间】:2021-08-23 22:07:52 【问题描述】:我下面的代码应该将客户对象的 describe 方法的返回值打印到终端……但事实并非如此。问题似乎是 NameError: name 'price' is not defined。
class TicketMixin:
""" Mixin to calculate ticket price based on age """
def calculate_ticket_price(self, age):
ticket_price = 0
price = ticket_price
if self.age < 12:
price = ticket_price + 0
elif self.age < 18:
price = ticket_price + 15
elif self.age < 60:
price = ticket_price + 20
elif self.age >= 60:
price = ticket_price + 10
return price
class Customer(TicketMixin):
""" Create instance of Customer """
def __init__(self, name, age,):
self.name = name
self.age = age
def describe(self):
return f"self.name age self.age ticket price is price"
customer = Customer("Ryan Phillips", 22)
print(customer.describe())
谁能告诉我我错过了什么?
【问题讨论】:
price
是calculate_ticket_price
中的局部变量,而不是name
或age
之类的属性。您必须致电 calculate_ticket_price
获取价值。
呃,我真傻。谢谢!
【参考方案1】:
你没有打电话给calculate_ticket_price
。
def describe(self):
return f"self.name age self.age ticket price is self.calculate_ticket_price(self.age)"
注意calculate_ticket_price
可以或者接受age
参数,在这种情况下它不需要假设self.age
存在:
class TicketMixin:
""" Mixin to calculate ticket price based on age """
def calculate_ticket_price(self, age):
ticket_price = 0
price = ticket_price
if age < 12:
price = ticket_price + 0
elif age < 18:
price = ticket_price + 15
elif age < 60:
price = ticket_price + 20
elif age >= 60:
price = ticket_price + 10
return price
或者您可以做出这样的假设并完全摆脱 age
参数:
class TicketMixin:
""" Mixin to calculate ticket price based on age """
def calculate_ticket_price(self):
ticket_price = 0
price = ticket_price
if self.age < 12:
price = ticket_price + 0
elif self.age < 18:
price = ticket_price + 15
elif self.age < 60:
price = ticket_price + 20
elif self.age >= 60:
price = ticket_price + 10
return price
那么describe
的主体将简单地省略任何显式参数:
def describe(self):
return f"self.name age self.age ticket price is self.calculate_ticket_price()"
在前者中,请注意您在定义中根本不使用self
;这表明它应该是一个静态方法,或者只是一个可以被Customer
使用的常规函数,而不需要任何混合类。
【讨论】:
成功了,谢谢!由于我在代码训练营中的学习挑战非常严格,因此摆脱年龄是不可能的。我现在调用了calculate_ticket_price,它成功了。再次感谢!【参考方案2】:切普纳是正确的。您必须在 init 函数中调用 calculate_ticket_price。正确的语法是使用 super 关键字。
例子:
class Customer(TicketMixin):
""" Create instance of Customer """
def __init__(self, name, age,):
self.name = name
self.age = age
self.price = super().calculate_ticket_price(self.age)
def describe(self):
return f"self.name age self.age ticket price is self.price"
您可以点击here了解更多关于超级关键字的信息。
【讨论】:
Err...super()
在这种情况下不需要。只需使用:self.calculate_ticket_price(self.age)
。并且,还要修复其他问题。您还将得到 price
未定义。好的,我看到你已经修复了price
! :-)
谢谢。我通过将变量附加到 calculate_ticket_price 来修复它,因为该函数返回价格。
根本没想过使用 super() - 很好的建议,谢谢!
这里不需要 super()。只需使用自我。
你是对的,quamrana。我试图模仿 Jose 使用继承的工作流程。如果您不需要继承,请按照 quamrana 的建议使用 self.price = self.calculate_ticket_price(self.age)。以上是关于NameError:名称“”未定义[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
python NameError:名称'ftax'未定义[关闭]