【发布时间】:2019-06-14 07:32:06
【问题描述】:
看到非常有趣的代码here,我正在尝试通过以下代码将函数用作类:
def CF_ptrec(sname='', sage=0, sgender=''):
name = sname
age = sage
gender=sgender
def getname():
return name
def setname(ssname):
global name; name = ssname
def getgender():
return gender
def setgender(ssgender):
global gender; gender = ssgender
def getage():
return age
def setage(ssage):
print("in setage fn; val rcd: ", ssage) # just for testing;
global age
age = ssage
def printrep():
print("Name: ", name)
print("Age: ", age)
print("Gender: ", gender)
print("===========================")
return { # a dictionary
"getname":getname, "setname":setname,
"getage":getage, "setage":setage,
"getgender":getgender, "setgender":setgender,
"printrep": printrep }
我可以创建对象并调用函数来打印它们的详细信息:
# CREATE OBJECTS:
arec = CF_ptrec("Ram", 5, "M")
brec = CF_ptrec("Tom", 15, "M")
# PRINT THEIR RECORDS:
arec["printrep"]()
brec["printrep"]()
输出:
Name: Ram
Age: 5
Gender: M
===========================
Name: Tom
Age: 15
Gender: M
===========================
但是,如果我尝试更改这些对象的年龄值,则无法正常工作:
# CHANGE AGE VALUES:
arec['setage'](25)
brec['setage'](25)
# PRINT RECORDS:
arec["printrep"]()
brec["printrep"]()
输出:
in setage fn; val rcd: 25
in setage fn; val rcd: 25
Name: Ram
Age: 5
Gender: M
===========================
Name: Tom
Age: 15
Gender: M
===========================
问题出在哪里,如何解决?
【问题讨论】:
-
当您将函数用作类时,实际上是在创建闭包。你可以在 Python 中查找一些关于非本地和闭包的主题。
-
虽然作为一个练习很有趣,但查看充满 getter 和 setter 的 Python 闭包对我来说看起来很反模式。课程肯定会更好地为您服务(可能没有getter和setter)。在更简单的情况下,闭包也有其用途。
-
我可以在没有getter和setter的情况下访问上面示例中对象的数据(姓名、年龄、性别)吗?