如何在python类中作为成员变量访问成员函数?
我有一门课:如何在python类中作为成员变量访问成员函数?,python,class,Python,Class,我有一门课: class Foo(): def bar(name): return something 我想要一个 foo = Foo() foo.name 返回与foo.bar('name')相同的值。有可能吗?正如您现在所描述的,名称仅存在于函数栏的作用域中,因此Foo无法直接访问它,除非您将其存储在其作用域中。最简单的解决方案是创建一个名为name的成员字段,并在bar中设置其值 class Foo(): def __init__(self):
class Foo():
def bar(name):
return something
我想要一个
foo = Foo()
foo.name
返回与foo.bar('name')相同的值。有可能吗?正如您现在所描述的,
名称
仅存在于函数栏
的作用域中,因此Foo
无法直接访问它,除非您将其存储在其作用域中。最简单的解决方案是创建一个名为name
的成员字段,并在bar
中设置其值
class Foo():
def __init__(self):
self.name = None
def bar(self, name):
self.name = name
return something
正如您现在所描述的,
name
仅存在于函数bar
的作用域中,因此Foo
无法直接访问它,除非您将其存储在其作用域中。最简单的解决方案是创建一个名为name
的成员字段,并在bar
中设置其值
class Foo():
def __init__(self):
self.name = None
def bar(self, name):
self.name = name
return something
申报你的班级:
class Foo:
def bar(self, name):
return 'something'
可以将该方法指定给属性
foo = Foo()
foo.name = foo.bar
如果您愿意,可以在构造函数中执行此操作。声明您的类:
class Foo:
def bar(self, name):
return 'something'
可以将该方法指定给属性
foo = Foo()
foo.name = foo.bar
如果愿意,您可以在构造函数中执行此操作。如果属性不存在,则会自动使用
bar
:
class Foo(object):
def bar(self, name):
return name
def bar2(self, attr, value):
print attr, value
def __getattr__(self, attr):
return self.bar(attr)
def __setattr__(self, attr, value):
self.bar2(attr, value)
foo = Foo()
print foo.name
foo.name = 'not name'
如果属性不存在,则会自动使用
条
:
class Foo(object):
def bar(self, name):
return name
def bar2(self, attr, value):
print attr, value
def __getattr__(self, attr):
return self.bar(attr)
def __setattr__(self, attr, value):
self.bar2(attr, value)
foo = Foo()
print foo.name
foo.name = 'not name'
类应该有一个属性来存储名称 试试这个
#!/usr/bin/python
class Foo:
def __init__(self):
self.name = ''
def bar(self, name):
self.name = name
return "name via bar(): %s" % name
f = Foo()
print f.bar("Jackson")
print f.name
类应该有一个属性来存储名称 试试这个
#!/usr/bin/python
class Foo:
def __init__(self):
self.name = ''
def bar(self, name):
self.name = name
return "name via bar(): %s" % name
f = Foo()
print f.bar("Jackson")
print f.name
但是我不知道成员字段的名字,它也应该使用一个任意的字符串,比如Self.NAME123,但是我不知道成员字段的名称,它也应该使用一个任意的字符串,比如Self.NAME123SATO,你考虑Fo.3是否是一个工作代码?如果不是,然后重新考虑这个问题。@ BasigW狼我希望我们可以有数字属性。Santo,你考虑Fo.3'是一个工作代码吗?如果没有,那就重新考虑这个问题。@BasicWolf我希望我们能有数字属性。你赢了我,投上一票。但是不需要
try
子句:\uu getattr\uuu
只被调用。你把它和“懒鬼”搞混了,我总是忘了!我习惯于在使用getattr
.Tkans时捕捉错误。这个很好用。现在,我正在考虑是否可以重载赋值运算符并进行异常操作(foo.name=val将调用bar2(name,val)“SATTO”——这不是C++,Python的''= '不是一个可以超载的操作符。是的,但是代码> > StAdTraceTy[< /C> > /Fract/描述符的效果是一样的,正如我所展示的。你打败了我,有了一个投票权。但是<<代码>尝试子句是不必要的:<代码>在!我非常习惯于在使用getattr
.Tkans时捕捉错误。这很好。现在我正在考虑是否可以重载赋值运算符并以异常方式执行(foo.name=val将调用bar2(name,val)“SATTO”——这不是C++,Python的''= ''不是一个可以超载的操作符。是的,但是foo.name
成为foo.bar
,他希望foo.name
成为foo.bar('name')
。他不希望foo.name
成为foo.bar
,他希望foo.name
成为foo.bar('name
)。