为了账号安全,请及时绑定邮箱和手机立即绑定

Python:从字符串访问类属性

Python:从字符串访问类属性

慕沐林林 2019-09-24 15:02:36
我有一个像下面这样的课程:class User:    def __init__(self):        self.data = []        self.other_data = []    def doSomething(self, source):        // if source = 'other_data' how to access self.other_data我想为源变量传递一个字符串,doSomething并访问同名的类成员。我试过getattr了仅对函数起作用(据我所知)以及具有Userextend dict和using self.__getitem__,但这也不起作用。做这个的最好方式是什么?
查看完整描述

4 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

x = getattr(self, source)如果source命名self的ANY属性(包括other_data您的示例中的),将可以完美地工作。


查看完整回答
反对 回复 2019-09-24
?
不负相思意

TA贡献1777条经验 获得超10个赞

一幅价值一千个字的图片:


>>> class c:

        pass

o = c()

>>> setattr(o, "foo", "bar")

>>> o.foo

'bar'

>>> getattr(o, "foo")

'bar'


查看完整回答
反对 回复 2019-09-24
?
隔江千里

TA贡献1906条经验 获得超10个赞

  • getattr(x, 'y') 相当于 x.y

  • setattr(x, 'y', v) 相当于 x.y = v

  • delattr(x, 'y') 相当于 del x.y


查看完整回答
反对 回复 2019-09-24
?
噜噜哒

TA贡献1784条经验 获得超7个赞

稍微扩展一下Alex的答案:


class User:

    def __init__(self):

        self.data = [1,2,3]

        self.other_data = [4,5,6]

    def doSomething(self, source):

        dataSource = getattr(self,source)

        return dataSource


A = User()

print A.doSomething("data")

print A.doSomething("other_data")

将产生:


[1,2,3]

[4、5、6]

但是,我个人认为这不是很好的样式- getattr可以让您访问实例的任何属性,包括doSomething方法本身甚至实例的属性__dict__。我建议您改为实现一个数据源字典,如下所示:


class User:

    def __init__(self):


        self.data_sources = {

            "data": [1,2,3],

            "other_data":[4,5,6],

        }


    def doSomething(self, source):

        dataSource = self.data_sources[source]

        return dataSource


A = User()


print A.doSomething("data")

print A.doSomething("other_data")

再次产生:


[1,2,3]

[4、5、6]


查看完整回答
反对 回复 2019-09-24
  • 4 回答
  • 0 关注
  • 862 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信