下面是我的用例:我想定义一个类似元组的对象,但是我可以通过属性名访问它的元素,例如
mytupleobj = TupObj(2012,3)
mytupleobj.year = 2012
mytupleobj.month = 3
Pythonsnamedtuple
是这方面的首选,但问题是参数的数量是固定的。所以,如果只需要像元组一样携带年份的对象,我要么需要实例化
mytupleobj = TupObj(2012, None)
或者创建一个只包含年份的名称元组的新定义。这两种解决方案看起来都很难看。你知道吗
有没有一种方法-或者使用namedtuple
或者其他技术-这样当我实例化
mytupleobj = TupObj(2012)
我得到了一个类似元组的对象实例,只有在使用
mytupleobj = TupObj(2012,2)
我得到一个类似元组的对象,它有year
和month
属性?你知道吗
您不需要不同的类定义。如果没有传入
month
值,您只需要使用属性的默认值使这些参数成为可选的。namedtuple()
工厂函数不支持这种用例。你知道吗但这不是创建命名元组的唯一方法。您还可以子类^{} :
这是命名元组的类定义,其中
month
是可选的,如果不指定月份,则保留默认值:但是,我怀疑您真正想要的是一个数据类。一个简单的类,主要只保存一些数据。你知道吗
python3.7有了新的^{} module ,或者您可以安装^{} project 。数据类可以具有可选属性(默认为定义时声明的值):
Dataclasses为您提供了非常简化的语法来定义一个小类,它附带了表示、相等性测试和可选的排序支持、哈希和不变性。你知道吗
数据类也完全支持继承,而命名元组则不支持
数据类不是自动可iterable或immutable的,但是可以这样做,请参见this previous answer of mine,在这里我定义了一个简单的
DataclassSequence
基类,它添加了序列行为。你知道吗快速演示:
您可以在
namedtuple
上设置默认值Python2.7解决方案:
Python3.7解决方案:
如果您的目标是从OOP的角度来实现一个易于理解的方法,那么您只需要使用条件并传递值的默认参数,在init期间检查它们的条件值。它可能看起来像这样:
实现/维护的另一种更干净的方法可以是将默认值保存为None,这样就不必担心每个对象中实际存在哪些属性。你知道吗
相关问题 更多 >
编程相关推荐