1

別のものを作成しているPythonクラスのインスタンスがあり、「作成された」クラスが「作成者」のメンバーに明示的に渡すことなく、または次のようなことを行うことなくアクセスできるかどうか疑問に思っています:

class Creator(object):
    def __init__(self, parameter):
        self.parameter = parameter
        self.created = Created(self)

class Created(object):
    def __init__(self, creator):
        self.creator = creator
        self.parameter = self.creator.parameter

私がやろうとしているのはparameter、実際には複数のパラメーターがあることを除いて、両方からアクセスできるようにすることだと思います。そのため、それらすべてを渡すと、引数のリストが長くなります。現在の私の解決策は、 aCreatorへの引数としてa を使用することCreatedです。これを行うためのより厄介でスマートな方法はありますか? 多分すべてのパラメータを辞書に入れますか?

4

3 に答える 3

3

あなたはこれを行うことができます.1つの小さな問題があります.

class Created():
    def __init__(self, creator):
        self.parameter = self.creator.parameter

ありませんself.creator。この__init__呼び出しの後に再度アクセスする必要がない場合は、creatorパラメーターを直接使用してください。

class Created():
    def __init__(self, creator):
        self.parameter = creator.parameter

後で必要な場合は、として保存してself.creatorください。もちろん、そこからアクセスできます。

class Created():
    def __init__(self, creator):
        self.creator = creator
        self.parameter = self.creator.parameter

…その場合は、コピーする必要さえないかもしれませんparameterが、いつでもself.creator.parameter.

これは非常に一般的なパターンです。

これの唯一の本当の欠点は、後方参照を ( ) の周りに置いておくと、メソッドself.creator = creatorを持てなくなること__del__です。(または、必要にweakref応じて作成者を検索するために使用できるキーのように、それを 、または間接参照にする必要があります。)

于 2013-08-21T01:18:15.823 に答える
0

別のオプション

class Creator():
    def __init__(self, parameter):
        self.parameter = parameter
        self.created = Created()
        self.created.creator = self
于 2013-08-21T01:42:44.650 に答える
0

私見それはうまく見えます。パラメータがインスタンスではなくクラス属性であれば継承も使えますが、そこまでの改善ではないと思います。

def creator_factory(param):
    class Creator(object):
        parameter = param
    return Creator

Creator = creator_factory(something)

class Created(Creator):
    pass

>>> Created().parameter
'something'
于 2013-08-21T01:28:18.287 に答える