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())

谁能告诉我我错过了什么?

【问题讨论】:

pricecalculate_ticket_price 中的局部变量,而不是nameage 之类的属性。您必须致电 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:名称“”未定义[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

错误:NameError:未定义名称“子进程”[关闭]

python NameError:名称'ftax'未定义[关闭]

NameError:未定义名称“convertToBinaryData”

NameError:名称“意思”未定义

NameError:名称“包”未定义

DD.close() NameError: 全局名称 'DD' 未定义