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() |
号
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方法。在你创建它之前它不知道它是什么。(即使是这样,它也会做一次,每个随机名称都会完全相同)
同样,当在类内部调用方法时,在类内部,您需要将其称为
这里有几个问题:
(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中,正确的缩进非常重要,因为这会标记代码块!
首先,要在实例上调用函数,需要在函数前面加上
1 | self.generate_name() |
号
其次,如果您将
第三,如果你真的想要这种行为,你必须先定义
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) |
。
在班级的最底层。