26

オブジェクトが作成されたら、辞書の場合と同じように、スロットを自由に追加および削除できます。メソッドもスロットに格納されているオブジェクトなので、辞書にメソッドを追加することもできます。

辞書では不可能だった(辞書以外の)オブジェクトでできることはありますか?または、特定のクラスのオブジェクトのように完全に見える辞書を設定することは可能ですか?

この質問は、それらがどのように作成されるかではなく、後でどのように使用できるかについてです。リンクや参考資料をいただければ幸いです。

4

5 に答える 5

19

オブジェクトが作成されたら、辞書の場合と同じように、スロットを自由に追加および削除できます。メソッドでさえ、スロットに格納されたオブジェクトにすぎません。

スロットと言うことに注意してください-Python__slots__では特定の意味があります。

だから私はおそらく辞書にメソッドを追加することもできます。

foo = {}
foo.bar = 1

AttributeError: 'dict' object has no attribute 'bar'

デフォルトでは、サブクラス化する必要がありますが、クラスを使用しています。代わりに、関数辞書に入れてください。

def bar():
    return 1

foo['bar'] = bar
foo['baz'] = lambda: 1

辞書ではできなかったオブジェクトでできることはありますか?

この質問には、実際には誤った前提があります。辞書はオブジェクトであるため、オブジェクトを使用して実行している辞書使用して実行することはすべてです。この回答の残りの部分では、「オブジェクト」と言うときは「ユーザー定義クラス」を意味するふりをします。

いいえ、辞書ではできないユーザー定義クラスでは何もできません。クラスは辞書でさえ実装されます。

class Foo(object):
    pass

print Foo.__dict__
# {'__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__', 
#      '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}

Pythonのクラスでできることはすべて、クラスがなくても、より多くの作業(および理解、使用、保守がはるかに難しいコード)で実行できます。Pythonクラスは辞書の単なる構文糖衣であるとさえ言われています。

最近、オブジェクトについて学ぶ必要があるのか​​、それとも時間を節約して辞書を学ぶだけなのか、という非常によく似た質問がありました。それに対する私の答えもここに関連していると思います。

于 2011-08-19T09:07:48.400 に答える
13

オブジェクトのメンバー関数を呼び出すと、最初のパラメーターとしてオブジェクト自体が渡されます。このようにして、所属するオブジェクトのプロパティを変更できます。

class Counter(object):
   def __init__(self):
      self.num = 0

   def inc(self):
      self.num += 1

count = Counter()
count.inc()

たくさんの関数をに格納するだけではdict、そのようなサポートは受けられません。同じ効果を得るには、手動でdictを渡す必要があります。

def Counter_inc(d):
   d['num'] += 1

def Counter_create():
   d = {
      'num': 0,
      'inc': Counter_inc,
   }
   return d

count = Counter_create()
count['inc'](count)

あなたがそれが可能である間あなたが見ることができるように、それははるかに不器用です。生のdictを使用してオブジェクトの多くの機能をエミュレートできますが、オブジェクトに特別な言語サポートがあると、オブジェクトが使いやすくなります。

また、たとえばisinstance()、生のdictでは簡単に複製できないオブジェクトタイプ情報を直接使用する機能もあります。

于 2011-08-19T09:20:28.200 に答える
3

他の答えにはある程度の根拠がありますが、特定の辞書をサブクラス化またはインスタンス化することはできないことを付け加えておきます。

class A(object): pass
class B(A): pass
a = A()

A = {}
B = ???
a = ???

したがって、辞書はオブジェクトであり、オブジェクトは主に辞書を使用して実装されます(詳細はわかりませんが)が、ジョブごとに異なるツールです。

于 2011-08-19T09:18:49.293 に答える
1

私はあなたがについて尋ねると思います

o1={"some_method": lambda par1, par2: par1+par2}
o1["some_method"](1, 2)

vs

class SomeClass:
    def some_method(self, par1, par2):
        return par1+par2

o2=SomeClass()
o2.some_method(1, 2)

?もしそうなら、私は実用的な観点からの主な違いは、それo2.some_methodが最初のパラメータとして自分自身をとるが、そうではないということだと思いますo1["some_method"]

于 2011-08-19T09:09:16.003 に答える
1

オブジェクトは、クラスから作成された{}です。

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

student1 = Student('John', 31) # student1 is an object
print(student1) # does not print the expected result, we need to "convert" it to dictionary
print(student1.__dict__) # prints {'name': 'John', 'age': 31}

辞書はクラスから作成されていない{}です:

student2 = { 'name': 'Kevin', age: 15 } # student2 is a dictionary
print(student2) # prints {'name': 'Kevin', 'age': 15}
于 2018-01-27T13:45:16.497 に答える