如何在Python 3中调用可选的内部函数

时间:2018-12-04 13:20:20

标签: python python-3.x class

我正在尝试学习Python,并且在创建自己的课程时遇到了这个问题。我想在函数内部调用内部函数。问题是如何在Python 3中构建这种类型的结构?

    def GetAttributes(self):
        def GetName(self):
            return self.name
        def GetSurname(self):
            return self.surname
        def GetAge(self):
            return self.age
        def GetID(self):
            return self.ID

基本上,我希望能够执行返回“ self.name”的“ GetAttributes()。GetName()”或返回“ self.name”的“ GetAttributes()。GetAge()”。

编辑:重复另一个问题。我正在尝试调用多个功能而不是一个。

3 个答案:

答案 0 :(得分:1)

我认为您的解决方案很简单,在Python中应用OOP,而不是将GetAttributes用作函数,而是将其作为类。

class GetAttributes(object):
    def __init__(self, name, surname, age, custome_id):
        self.name = name
        self.surname = surname
        self.age = age
        self.ID = custome_id
    def GetName(self):
        return self.name
    def GetSurname(self):
        return self.surname
    def GetAge(self):
        return self.age
    def GetID(self):
        return self.ID

输出

>>> ga = GetAttributes("Shivam", "Kotwalia", 25, "N15T5")
>>> ga.GetName()
    'Shivam'
>>> ga.GetAge()
    25

我不太确定如何填充数据,但这似乎是非常Python化的方法:)

Pythoning快乐!

答案 1 :(得分:1)

@ShivamKotwalia的答案就是您要寻找的,但是由于您似乎正在试图理解为什么您的实现无效的原因,所以我会做一点扩展。

当前,您的实现是在the local scope中创建嵌套函数。换句话说,一旦代码在函数之外,除非return设置为外部作用域,否则本地作用域内的对象将不复存在。例如修改您的代码:

def GetAttributes(person):
    def GetName(person):
        return person.name
    def GetSurname(person):
        return person.surname
    return GetName, GetSurname

这使您现在可以引用回GetNameGetSurname,因为它们已被传递回外部范围。假设您有一个Bob对象,该对象的属性为namesurname

name = GetAttributes(Bob)
name
# (<function GetAttributes.<locals>.GetName at 0x03E9AB28>, <function GetAttributes.<locals>.GetSurname at 0x03E9AB70>)

请注意name是如何传递两个内部函数的,它们是<locals>。而GetAttributesglobal范围内:<function GetAttributes at 0x03E9AA50>

然后您可以通过索引name获得这两个函数:

name[0](Bob)
# Bobby
name[1](Bob)
# Tables

再次注意您仍然需要传递Bob的方式,因为这两个函数都定义为需要参数person。您可以选择删除参数...:

def GetAttributes(person):
    def GetName():
        return person.name
    def GetSurname():
        return person.surname
    return GetName, GetSurname

但是您仍然会遇到一些问题:

  1. 首先必须为该函数分配一个对象,以访问内部函数。
  2. GetAttributes函数仅返回其内部函数。
  3. 对本地功能的访问没有有意义的结构。
  4. 不能保证您传入的对象始终具有namesurname属性。

这就是为什么存在OOP方法(例如class)和methods的原因:

class Person:
    def __init__(self, name, surname):
        self.name = name
        self.surname = surname
    def GetName(self):
        return self.name
    def GetSurname(self):
        return self.surname

现在您可以解决以上所有问题:

  1. 您只需要创建Person class的实例,而不是处理混乱的函数。
  2. GetAttributes不再需要。
  3. 轻松而有意义的访问以获得Person().GetName()
  4. 使用这些methods的对象保证具有namesurname属性。

“但是GetAttributes方法呢?”你问?为什么,Python确实有一个built-in getattr() function可以满足您的需求!

getattr(Bob, 'name')
# Bobby

说了这么多,就有了{em> function attributes,您可以在其中执行以下操作:

def GetAttributes(person):
    def GetName():
        return person.name
    def GetSurname():
        return person.surname
    GetAttributes.GetName = GetName
    GetAttributes.GetSurname = GetSurname
    return GetAttributes

GetAttributes(Bob).GetName()
# Bobby

但是您很快就会遇到限制和问题,这些问题和问题可能会影响您在范围内传递的所有对象和功能。试试看,您会看到的。因此,为什么在classgetattrmethods已经采取适当的保障措施的情况下已经做好了您需要的所有工作,您为什么会选择遇到这种麻烦呢?

答案 2 :(得分:0)

我认为这可能会有所帮助,请尝试以下操作:

def get_attributes(self, attr_name):
    return {
        'name': self.name,
        'surname': self.surname,
        'age': self.age,
        'ID': self.ID,
    }.get(attr_name)

,您可以像get_attributes(name)get_attributes(age)这样使用它。 另外,请注意,在评论中,我们的朋友说,在Python中,方法名最好使用小写字母。这是Python的命名约定之一。