如何在类参数中调用函数

时间:2014-12-13 00:16:11

标签: python class oop inheritance

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

假设我有一个从NewPerson创建的对象,但我没有说出名字 在参数内如:

dave = NewPerson()

我想使用我的generate_name函数生成一个随机名称。这是我当前的代码,但我收到错误:NameError:name' generate_name'未定义

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

3 个答案:

答案 0 :(得分:2)

import randomgenerate_name函数是因为我不知道你的Generate班级做了什么

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 :(得分:1)

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

self.generate_name()

其次,如果你将generate_name调用放在函数头中,那么在定义函数时它将被称为,而不是再次 - 所以你将拥有一个&# #34;随机"默认名称。

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

class NewPerson(object):

    def generate_name():
        blahblah

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

这使得generate_name一旦完成构建类就会失效,除非你添加类似的东西:

    generate_name = staticmethod(generate_name)

走向全班的底层。

答案 2 :(得分:1)

这里有几个问题:

(1)在声明类之后需要缩进 - 在本例中是所有成员函数定义

(2)由于缩进问题,您不清楚是否需要' generate_name'成为NewPerson类的成员函数,或者如果您希望它是一个独立的函数。 如果你不希望它在课堂内,那么只需将其定义移到之前 NewPerson的定义,一切都应该正常工作:

def generate_name():
   [code here]

class NewPerson(object):
   [code here]

另一方面,如果你想让generate_name成为NewPerson的成员函数,那么你不能做你正在尝试的事情,但是一个简单的修复就像下面这样(注意缩进):

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中,缩进是正确的,因为这标记了代码块!