【问题标题】:How to write general get methods for a class?如何为类编写通用 get 方法?
【发布时间】:2016-09-20 09:56:36
【问题描述】:

最近我开始在 python 中使用 oop。我想为启动的属性编写一个通用的 get 或 set 方法。例如,Song 类具有多个属性和相应的 get 方法。我想避免使用多个 if 语句。只有两个属性没关系,但如果有> 5个属性,代码将难以阅读。是否可以在 args 中使用字符串从 init 获取值而不定义所有可能的情况?

class Song(object):

    def __init__(self,title,prod):
        self.title = title
        self.prod = prod

    def getParam(self,*args):
        retPar = dict()
        if 'title' in args: 
            print(self.title)
            retPar['title'] = self.title
        if 'prod' in args:
            print(self.prod)
            retPar['prod'] = self.prod
        return(retPar)

我不确定这是否可能,因为我找不到任何东西。我怎样才能做到这一点?

【问题讨论】:

  • 我不确定你为什么要这样做。为什么你需要一个方法?
  • return {attr: getattr(self, attr) for attr in args}…?
  • @Daniel Roseman:为不熟悉python语法的同事提供一个功能,使他们不必直接访问属性。用于绘图等。
  • “我想为启动的属性编写一个通用的 get 或 set 方法” - 为什么?这不是 Java,要么直接访问它们,要么使用 @property
  • 为什么连最基本的 Python 语法都不熟悉的人会写 Python? attrs = song.getParam('title', 'prod'); attrs['title']song.title 更好或更容易吗?

标签: python oop methods args


【解决方案1】:

为不熟悉python语法的同事提供一个函数,使他们不必直接访问属性。用于绘图之类的事情

因为python不一定是教过的,点语法对于matlab有基础知识的人来说是比较混乱的

我认为这很容易被教授,你不应该为了这么简单的事情而向后弯腰……但假设这确实是你想要的,这看起来是一个更好的主意:

class Song(object):
    def __init__(self, title, prod):
        self.title = title
        self.prod = prod
    
    def __getitem__(self, key):
        return getattr(self, key)

song = Song('Foo', 'Bar')
print song['title']

请参阅 https://docs.python.org/2/reference/datamodel.html#object.__getitem__https://docs.python.org/2/library/functions.html#getattr

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多