关于python:如何在类参数中调用函数

How to call a function within a class parameter

我需要一些关于生成对象实例的帮助。

假设我有一个对象是从newperson创建的,但我没有输入名称在这样的参数中:

1
dave = NewPerson()

我想使用生成名称函数生成一个随机名称。这是我当前的代码,但我得到了错误:名称错误:名称未定义"生成名称"

1
2
3
4
5
6
7
8
9
10
11
12
13
class NewPerson(object):
    def __init__(self, name = generate_name()):
        self.name = name
        self.age = 0

    def set_name(self,name):
        self.name = name

    def get_name(self):
        return (self.name)

    def generate_name(self):
        self.name = Generator.get_full_name()


import randomgenerate_name函数是因为我不知道你的Generate类做什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
import random #just for a quick generate random name thing
class NewPerson(object):
    def __init__(self, name = fart_knock()):
        #this entire if/else block is equivilant to"self.name = name or self.generate_name()", thanks troolee
        if name == None:
            self.name = self.generate_name()
        else:
            self.name = name
        self.age = 0

    def generate_name(self):
        #because i have no idea how your Generator class works
        return str(random.randrange(9999))

您的工作不正常,因为您正试图将类内的函数赋给init方法。在你创建它之前它不知道它是什么。(即使是这样,它也会做一次,每个随机名称都会完全相同)

同样,当在类内部调用方法时,在类内部,您需要将其称为self.generate_name(),而不仅仅是generate_name()


这里有几个问题:

(1)您需要在声明类之后缩进-在这种情况下,您的所有成员函数定义

(2)由于缩进问题,不清楚您是希望"generate_name"成为newperson类的成员函数,还是希望它成为独立函数。如果您不希望它在类中,那么只需将其定义移动到newperson定义之前,一切都会正常工作:

1
2
3
4
5
def generate_name():
   [code here]

class NewPerson(object):
   [code here]

另一方面,如果您确实希望生成u name作为newperson的成员函数,那么就不能执行您正在尝试的操作,但简单的修复方法如下(注意缩进):

1
2
3
4
5
6
7
8
def NewPerson(object):
   def __init__(self, name = None):
      if name == None:
         self.name = self.generate_name()
      else:
         self.name = name
   def generate_name(self):
      [code here]

带走的信息是,您需要使用缩进来告诉Python哪些代码片段与其他片段相匹配。这些被称为代码块,在其他语言中,它们可以用之类的操作符来处理,但在Python中,正确的缩进非常重要,因为这会标记代码块!


首先,要在实例上调用函数,需要在函数前面加上self

1
self.generate_name()

其次,如果您将generate_name调用放在函数头中,那么在定义函数时将调用它,而不是再次调用它——所以您将有一个"随机"的默认名称。

第三,如果你真的想要这种行为,你必须先定义generate_name,然后关闭self(在你调用它和定义它的时候):

1
2
3
4
5
6
7
class NewPerson(object):

    def generate_name():
        blahblah

    def __init__(self, name=generate_name()):
        blahblah

这使得类一旦构造完成,EDOCX1[1]就没有用处,除非添加如下内容:

1
    generate_name = staticmethod(generate_name)

在班级的最底层。