首页 > 解决方案 > 是否可以根据某种属性自动生成 getter 和 setter 函数?

问题描述

我有一个具有数百个属性的“用户”类,我不确定是否最好使用一个类并且必须手动创建数百个 getter 和 setter,它们只是将值设置为 dict 中的键或只使用直接用字典。拥有 getter 和 setter 似乎是抽象属性内部表示的最佳方式,因此我可以从 dict 更改为以后需要的任何内容,我只是不想公开这些键以防它们需要更改。

例如,我们在类 foo 中有一些属性:

class User(object):
     attributes = {"fname": None,"lname": None,}

我想要一些东西让您调用 get_fname()并让它返回fname or的值get_lname()并设置它的值,lname而无需定义函数。与设置器相同的方式, set_fname(value)将设置 fnames 值等等。我不确定这是否可能,或者我是否只是过度思考问题并错过了一个简单的解决方案。

标签: pythonfunction

解决方案


您可以简单地定义类中的所有属性。每个实例似乎都将所有类变量作为成员(默认值),如果为任何特定实例的属性设置了值,它将更新实例__dict__而不是类__dict__

class User(object):
    fname = ''
    mname = ''
    lname = ''

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

user1 = User(fname='Foo', lname='Bar')
user2 = User(lname='Public', fname='John')
user2.mname = 'Q'

print(f"{user1.fname} {user1.mname} {user1.lname}")   # prints "Foo  Bar"
print(f"{user2.fname} {user2.mname} {user2.lname}")   # prints "John Q Public"

正如其他评论所说,如果可能,最好避免在单个对象中包含如此多的变量,并且具有显式的 getter 和 setter 是非 Pythonic。
如果您需要 getter 和/或 setter,您可以随时在需要时添加它们;Java 不会让你这样做,但 Python 会。


推荐阅读