-3

私はこことPythonチュートリアルでPythonOOPについてたくさん読んでいます。しかし、いくつかの質問はクラス属性について私を悩ませます。

例:

class Par(object):
    def __init__(self, chip, fig):
        self.fruit = chip
        self.fig = fig
        self.pear =10
  1. すべきではself.fruit = chipないself.chip = chip
  2. 括弧内fruitの属性リストに表示されないのに、なぜ使用されるのですか?__init__()
  3. self.fruit = chipとの違いは何self.chip = chipですか?
  4. __init__()内で属性を宣言することと、外部で属性を宣言することの違いは何ですか__init__()self.pear =10
4

3 に答える 3

3

selfのインスタンスになりますParself.__dict__の属性を保持する dict ですself。あなたが言う時

self.fruit = chip

dict のエントリが作成されます:self.__dict__が含まれます{'fruit':chip}

あなたが言う時

def __init__(self, chip, fig):

Par2 つの値を渡す必要があるとchip宣言していますfig。(selfインスタンスは に渡さ__init__れます。)

したがって、 の内部では__init__ローカル変数(属性ではありません!)chipfigが既知です。

self.fruit = chipvalueを持つ属性 を作成しています。fruitchip


例えば、

class Par(object):
    def __init__(self, chip, fig):
        self.fruit = chip
        self.fig = fig
        self.pear = 10

# 99 is being passed in as the value of `chip`
# 'bar' is being passed in as the value of `fig`    
par = Par(99,'bar') 
print(par.__dict__)

収量

{'fruit': 99, 'pear': 10, 'fig': 'bar'}

属性にアクセスするには、たとえば ではpar.fruitなく、通常使用することに注意してくださいpar.__dict__['fruit']。上に示しpar.__dict__たのは、舞台裏で何が起こっているかを示すためだけです。

于 2012-10-14T14:38:35.157 に答える
1

「self.fruit = chip」と「self.chip = chip」の違いは何ですか?

違いは1つだけです。chip最初のケースでは、という名前の属性に保存していますがfruit、2番目のケースでは、そのchip. __dict__クラスの属性のエントリは、LHSとのペアRHSとして作成されます。name-valueLHS は、クラスの属性のattribute値にリンクするために使用しているの名前を示します。__dict__あなたはany nameそこにいることができます..

init () ブラケットの属性リストにフルーツが表示されないのはなぜですか?

上に書いたのと同じ理由です。fruitクラス属性です。メソッドで宣言し__init__、渡された値をそれに割り当てますattribute

init() で属性を宣言することと、_init() の外側で宣言することの違いは何ですか。たとえば、「self.pear =10」

内部で宣言された変数__init__はクラス属性です。それらは、そのクラス用に作成されたすべてのインスタンスに共通です。一方、外部で宣言する属性はinstance固有です。したがって、具体的には、クラスのすべてのインスタンスが「異なる属性のセット」を持つことができます。

class Demo:
    def __init__(self, name):
        # This attribute is linked to every instance through self parameter, 
        # which contains the reference to the current instance.
        self.name = name   

demo1 = Demo("demo1")

demo2 = Demo("demo2")

demo1.attr = "new Attr"   # Creating Attribute on the fly.

demo2.diffAttr = "diff Attr"

したがって、上記のコードでは: -

  • インスタンスdemo1には 2 つの属性がnameあり、attr
  • また、インスタンスdemo2には 2 つの属性もありnamediffAttr2 番目の属性は両方のインスタンスで異なります。
于 2012-10-14T14:35:04.240 に答える
1
  1. どちらかが正しいです。

  2. Python では、変数を宣言する必要はありません。self.fruit = chip変数を作成し、変数のself.fruit値を割り当てますchip

  3. self.fruit = chipの値をchip変数self.fruitself.chip = chip格納し、の値を格納chipしますself.chip

  4. chipPar オブジェクトにflagは属しません。これらは、関数が呼び出されたときに関数に渡される値にアクセスするために使用されます。

キーワードは、それselfに続く変数がオブジェクトのメンバーであることをインタープリターに伝えます。あなたの例では、 と の値chipfig関数__init__が実行された後に失われますがself.fruitself.figとの値self.pearはオブジェクトが離れる限り残ります。これは、それらが異なるスコープを持っていることを意味します。

__init__関数が実行された後、次のように の値self.fruitを読み取って変更できます。self.figself.pear

par = Par(oneChip, oneFig)
print par.fruit
print par.fig
par.pear = 20
print par.pear
于 2012-10-14T14:37:28.297 に答える