1
class Foo(object):
    def __init__(self):
        self.list_one = [1, 2, 3]


class Bar(object):
    def init(self):
        self.list_two = Foo.list_one + [4, 5, 6] # I know this won't work unless I 
                                                 # make list_one a class level variable

したがって、問題は、クラスレベルの変数をインスタンス化Fooまたは作成せずにこれらのリストをマージする方法はありますか?list_one

継承を使用してこれを行う方法があるかもしれませんが、それを使用super()してメソッド内の変数にアクセスする方法がわかりません。また、継承を使わずにそれを行う方法についての回答をいただければ幸いです。

4

2 に答える 2

2

極端なバイトコード ハッカーを除けば、関数から値を取り出して別の関数内で使用することは不可能です。

さらに、Barは のサブクラスではなく、FooPython は明示的な を使用してインスタンス メソッドを呼び出す際にかなり恣意的な型チェック制限を課しているためself、次のような賢明なことはできません。

class Bar(object):
    def __init__(self):
        Bar.__init__(self)
        self.list_one += [4, 5, 6]

Fooおそらく、リストを返すクラスレベルのゲッターを作成する必要がありますか?

class Foo(object):
    def __init__(self):
        self.list_one = self.get_list_one()

    @classmethod
    def get_list_one(cls):
        return [1, 2, 3]
于 2012-09-24T19:57:35.580 に答える
2

あなたが説明したことを正確に行うことは不可能です。selfのインスタンスへの参照でありFoo、クラスがインスタンス化されるまで存在しません。およびlist_oneは の属性であり、作成後にselfに割り当てられます。selfしたがってlist_one、クラスがインスタンス化されるまではまったく存在しません。

ただし、継承を使用して求めていることを行うのは非常に簡単です。

class Foo(object):
    def __init__(self):
        self.list_one = [1, 2, 3]

class Bar(Foo):
    def init(self):
        super(Bar, self).__init__()
        self.list_two = self.list_one + [4, 5, 6]
        # if you want to discard list_one, you can, but that seems wrong somehow
        # del self.list_one

より一般的には、メソッドまたは関数の実行中、または関数によって作成されたクロージャーと呼ばれるものを参照する場合を除いて、「メソッド内の変数」を参照することはあまり意味がありません。関数が呼び出されるたびに、新しい名前空間が作成され、その名前空間内にローカル変数名が新たに作成されます。

ただし、関数が呼び出された後にそれらを参照することは可能です。例えば:

>>> def foo(x):
...     a = x
...     def bar():
...         print a
...     return bar
... 
>>> bar1 = foo(5)
>>> bar2 = foo(6)
>>> bar1()
5
>>> bar2()
6

の 2 つのバージョンが のbar異なる値を参照していることに注意してください。それぞれの値は、とが呼び出さaれたときに作成されました。foo(5)foo(6)

于 2012-09-24T19:58:25.313 に答える