我正在尝试学习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()”。
编辑:重复另一个问题。我正在尝试调用多个功能而不是一个。
答案 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
这使您现在可以引用回GetName
和GetSurname
,因为它们已被传递回外部范围。假设您有一个Bob
对象,该对象的属性为name
和surname
:
name = GetAttributes(Bob)
name
# (<function GetAttributes.<locals>.GetName at 0x03E9AB28>, <function GetAttributes.<locals>.GetSurname at 0x03E9AB70>)
请注意name
是如何传递两个内部函数的,它们是<locals>
。而GetAttributes
在global
范围内:<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
但是您仍然会遇到一些问题:
GetAttributes
函数仅返回其内部函数。 name
和surname
属性。这就是为什么存在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
现在您可以解决以上所有问题:
Person
class
的实例,而不是处理混乱的函数。GetAttributes
不再需要。 Person().GetName()
。 methods
的对象保证具有name
和surname
属性。“但是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
但是您很快就会遇到限制和问题,这些问题和问题可能会影响您在范围内传递的所有对象和功能。试试看,您会看到的。因此,为什么在class
,getattr
和methods
已经采取适当的保障措施的情况下已经做好了您需要的所有工作,您为什么会选择遇到这种麻烦呢?
答案 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的命名约定之一。