python - 是否可以根据某种属性自动生成 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 值等等。我不确定这是否可能,或者我是否只是过度思考问题并错过了一个简单的解决方案。
解决方案
您可以简单地定义类中的所有属性。每个实例似乎都将所有类变量作为成员(默认值),如果为任何特定实例的属性设置了值,它将更新实例__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 会。
推荐阅读
- gatling - Gatling 在模拟开始前写入 .csv 文件
- python - Python 中的网络爬虫:查找标签值
- php - Woocommerce 中特定运输类别、最低金额和特定国家/地区的免费送货购物车消息
- c++ - 分配 x 指向 y 指向的位置会导致任何内存泄漏吗?
- django - 视图中的 Django 内联表单集字段必需/非必需设置
- javascript - 如何缩短此 java 脚本代码长度并添加动画?
- android-jetpack-compose - 撰写 w Google 地图:协程中的 mapView.getMapAsync 与 mapView.awaitMap
- javascript - 如何使用 VS Code 中的 Tab 使自动完成功能正常工作?
- django - Django:将列、字段从子模型移动到父模型?
- java - 如何在 Java 中解析其元素均已命名的 JSON 列表?