我有两个类,一个Container
类和一个Field
类。 我想将Field
类表示为它包含的值。 它需要键入,以便我可以用它执行一些有意义的操作。
import datetime
class Field(object):
date = datetime.date.today()
def __repr__(self):
return self.date
class Container(object):
value = Field().date
value_2 = Field()
c = Container()
print c.value.isoformat() # perfect
print c.value_2.isoformat() # boo fails
我知道SQLAlchemy做了一些类似的事情。 将属性定义为返回类型化值的列实例。
这是描述符的完美用例。基本上__get__
类上定义Field
方法并从中返回预期值。您还可以根据需要定义__set__
,例如不允许他们设置其他类型的值。
import datetime
class Field(object):
def __init__(self):
self.val = datetime.date.today()
def __get__(self, instance=None, type=None):
if instance is not None:
return self.val
return self
class Container(object):
value_1 = Field()
value_2 = Field()
c = Container()
print c.value_1.isoformat() # 2016-03-03
print c.value_2.isoformat() # 2016-03-03