【问题标题】:How to call a function within a class parameter如何在类参数中调用函数
【发布时间】:2014-12-13 00:16:11
【问题描述】:

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

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

dave = NewPerson()

我想使用我的 generate_name 函数生成一个随机名称。这是我当前的代码,但出现错误:NameError: name 'generate_name' is not defined

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

【问题讨论】:

  • 忘记 Python 中的访问器,只需使用 myclass.instance_variable。如果您需要,您可以稍后通过更改类定义而不是所有引用它的地方来添加访问器(如果您确实需要它们)。请参阅stackoverflow.com/questions/13852279/… 了解更多详情。
  • 知道这个很有用,谢谢!

标签: python class oop inheritance


【解决方案1】:

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

【讨论】:

  • self.name = name or Generator.get_full_name()
  • 嘿。那很酷,我从来没有想过。只是看着它(在你编辑之前)我以为你疯了......仍然不确定它是如何工作的,因为表面上看起来name or Generator.get_full_name()应该返回一个布尔值(我猜是因为我主要使用or在像if a or b: 这样的语句中,(假设Generator.get_full_name() 当然会返回一个字符串
  • 运算符or 将返回第一个非假值。 or 也是懒惰的,这意味着如果名称是 non-calse (None、空字符串、0、False、{}、()、[] 等),python 将永远不会调用 Generator.get_full_name()
【解决方案2】:

这里有几个问题:

(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 中,正确缩进非常重要,因为这会标记您的代码块!

【讨论】:

    【解决方案3】:

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

    self.generate_name()
    

    其次,如果您将 generate_name 调用放在函数头中,在定义函数时会调用它,而不是再次调用——因此您将拥有一个“随机”的默认名称.

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

    class NewPerson(object):
    
        def generate_name():
            blahblah
    
        def __init__(self, name=generate_name()):
            blahblah
    

    一旦类构建完成,这会使generate_name 无用,除非您添加如下内容:

        generate_name = staticmethod(generate_name)
    

    朝向班级的底部。

    【讨论】:

      猜你喜欢
      • 2019-11-29
      • 2019-02-12
      • 2016-11-13
      • 1970-01-01
      • 2013-03-19
      • 2020-10-19
      相关资源
      最近更新 更多