私たちのプロジェクトでは、さまざまなソースから多数の情報を収集し、監査とデータソース間の競合を解決します各属性についてのメタデータをまとめておく必要があります。Python:クラスの変数に属性を追加して割り当て(記述子クラス)を生かす
age = 21
age_metadata = {
'source' : 'office gossip',
'relability' : 0
{
問題はクラスがこのように見えることです。
class Person
def __init__(self, id,):
self.id = id
self.id_meta = None
self.age = None
self.age_meta = None
self.name = None
醜いように見え、すべての属性が2倍になるので、私が望むのは各属性の下にメタデータをネストすることです。だから私が必要ならば、bob.age_meta
の代わりにbob.age.meta
と呼ぶことができます。そして、属性を多かれ少なかれ変えずに残しておきたいと思います。私はいつも私が好きな、それを使用するために何かをしたい:
def main():
bob = Person(1)
bob.age.meta = 'random metadata'
bob.age = 30
assert bob.age.meta == 'random metadata'
今、私はこれが割り当て+いくつかの猿のパッチ/メタデータを保持するために魔法をmetaclassingを傍受する記述子クラスのコンボを使用して可能であるべきだと思います。..しかし、私はこれらすべての機能を初めて使い、非常に迷子になっています。ここに私の現在のスケッチです。作業コードから長く:
class AttributeWithMeta(object):
"""interceot attribute fucntions"""
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
"""take attribute and somehow replace it with monkey patched version"""
self._value = magic(value,meta)
@staticmethod
def magic(value, meta):
"""adds meta attribute to objects regardless of type"""
return value_with_meta
class Person(object):
age = AttributeWithMeta()
def __init__(self, id):
self.id = id
私は正しい方向に行っていますか?私が行方不明になっているこれを行うための他の方法がいくつかありますか?私はここで不可能にしようとしていますか?
P.S最悪の場合age.get_meta()
は、属性に問題がある場合は許容されます。
また、これはデータベースでモデル化するのに適しています。たとえば、sqlalchemy + sqliteを実行できます。 – tdelaney