为什么在方法参数中无法识别我的类的实例?

Why is an instance of my class not being recognised in the method parameters?

提问人:MWallace 提问时间:7/11/2022 最后编辑:Marco BonelliMWallace 更新时间:7/11/2022 访问量:48

问:

我在 Python 中使用类实例属性作为方法参数的默认值时遇到了问题。让我向你展示吐出错误的代码:

class Table():

    # then a bunch of other methods and an __init__

    def print_table(self,message = f'Current bet: {human.bet}'):
        
        self.human_cards(human.hold_cards)
        self.info_lines(human,cpu,message)
        self.cpu_cards(cpu.hold_cards)
        
        for item in self.hum_print:
            print(item)
        for item in self.info_print:
            print(item)
        for item in self.cpu_print:
            print(item)

我的错误是:

NameError                                 Traceback (most recent call last)
<ipython-input-7-bf1a6f19a3b1> in <module>
----> 1 class Table():
      2 
      3 
      4     def __init__(self, length, height, card_width = 10, card_spacing = 5):
      5         self.length = length

<ipython-input-7-bf1a6f19a3b1> in Table()
     44         self.info_print = [line1, line2, line3, line4, line5, line6]
     45 
---> 46     def print_table(self,message = f'Current bet: {human.bet}'):
     47 
     48         self.human_cards(human.hold_cards)

NameError: name 'human' is not defined

human是一个类的实例,我在这个类的其他方法中使用该属性非常好。在定义之前没有调用类的实例,有没有办法以这种方式使用属性?Playerhuman.betTableTablehuman

python 参数传递

评论

0赞 Marco Bonelli 7/11/2022
human需要在定义类时定义。显然不是。只需用作占位符并在函数体中检查即可。- “在定义 human 之前,不会调用 Table 类的实例” - 是的,但如果未定义,则该类甚至无法定义,因为您将其用作其方法之一定义的一部分。= Nonehuman
0赞 wjandrea 7/11/2022
确切地在哪里定义?请提供一个最小的可重复示例。我想发布一个答案,但如果没有上下文,很难给出好的建议。不过,Marco 可能是对的,您可能应该用作哨兵值。human=None

答:

0赞 Martin Kroll 7/11/2022 #1

您的代码将始终引发 NameError,直到名称“human”出现在定义类表的同一范围内(在表类定义之前)。您可以通过导入名称或在同一模块中定义名称来添加名称。

from some_module import human

class Table():
    def print_table(self,message = f'Current bet: {human.bet}'):

human = Player()

class Table():
    def print_table(self,message = f'Current bet: {human.bet}'):

无论如何,这是一个糟糕的依赖关系。

评论

2赞 ShadowRanger 7/11/2022
因为它是一个默认参数,所以也可以在类的顶层定义,只要它是在 .在函数中,您不能进行此类非限定引用,但在默认参数中可以。humanprint_table
0赞 MWallace 7/11/2022
谢谢大家,这回答了我的问题。这是我第一个使用类的项目,所以我对一些事情仍然有点毛茸茸的。