0

私のクラスの1つは、オブジェクトのコレクションに対して多くの集計計算を実行してから、特定のオブジェクトに適切な属性と値を割り当てます。

class Team(object):
    def __init__(self, name): # updated for typo in code, added self
        self.name = name

class LeagueDetails(object):
    def __init__(self): # added for clarity, corrected another typo
        self.team_list = [Team('name'), ...]
        self.calculate_league_standings() # added for clarity


    def calculate_league_standings(self):
        # calculate standings as a team_place_dict
        for team in self.team_list:
            team.place = team_place_dict[team.name] # a new team attribute

が実行されている限りcalculate_league_standings、すべてのチームが実行されていることを私は知っていますteam.place。私ができるようにしたいのは、コードをスキャンしてclass Team(object)、クラスメソッドによって作成された属性と、クラスオブジェクトを操作する外部メソッドによって作成されたすべての属性を読み取ることです。for p in dir(team): print p属性名が何であるかを確認するためだけに入力するのに少しうんざりしています。attributesチームで空白の束を定義できます__init__。例えば

class Team(object):
    def __init__(self, name): # updated for typo in code, added self
        self.name = name
        self.place = None # dummy attribute, but recognizable when the code is scanned

calculate_league_standings戻っteam._placeてから追加するのは冗長なようです

@property
def place(self): return self._place

上部にある属性のリストにコメントできることはわかっていますがclass Team、これは明らかな解決策ですが、ここにはベストプラクティスが必要であり、ここではPythonのようなエレガントなものが必要だと感じています。

4

2 に答える 2

1

私があなたの質問を半分理解しているなら、あなたはインスタンスのどの属性が初期化後に追加されたかを追跡したいと思うでしょう。この場合、次のようなものを使用できます。

#! /usr/bin/python3.2

def trackable (cls):
    cls._tracked = {}

    oSetter = cls.__setattr__
    def setter (self, k, v):
        try: self.initialized
        except: return oSetter (self, k, v)
        try: self.k
        except:
            if not self in self.__class__._tracked:
                self.__class__._tracked [self] = []
            self.__class__._tracked [self].append (k)
        return oSetter (self, k, v)
    cls.__setattr__ = setter

    oInit = cls.__init__
    def init (self, *args, **kwargs):
        o = oInit (self, *args, **kwargs)
        self.initialized = 42
        return o
    cls.__init__ = init

    oGetter = cls.__getattribute__
    def getter (self, k):
        if k == 'tracked': return self.__class__._tracked [self]
        return oGetter (self, k)
    cls.__getattribute__ = getter

    return cls

@trackable
class Team:
    def __init__ (self, name, region):
        self.name = name
        self.region = region

#set name and region during initialization
t = Team ('A', 'EU')

#set rank and ELO outside (hence trackable)
#in your "aggregate" functions
t.rank = 4 # a new team attribute
t.ELO = 14 # a new team attribute

#see witch attributes have been created after initialization
print (t.tracked)

質問がわからない場合は、どの部分が間違っているかを明記してください。

于 2013-03-03T19:35:47.120 に答える
1

Pythonは動的であるため、あなたの質問に対する一般的な答えはないと思います。setattr()インスタンスの属性は、純粋な割り当て、、、への書き込みなど、さまざまな方法で設定できます__dict__。Pythonコードを静的に分析し、これらすべてのメソッドを分析してクラスのすべての可能な属性を正しく決定するツールを作成することは非常に困難です。

あなたの特定のケースでは、プログラマーとして、class Team多くの場合、それがplace属性を持つことを知っているので、明示的に決定して、そのコンストラクターを次のように書くことができます。

class Team(object):
def __init__(name ,place=None):
    self.name = name
    self.place = place

読み取りまたは書き込み時に副作用または派生が発生することを望まない限り、単純な属性のプロパティを定義する必要はないと思います。

于 2013-03-03T19:30:52.413 に答える