オブジェクトが作成されたら、辞書の場合と同じように、スロットを自由に追加および削除できます。メソッドもスロットに格納されているオブジェクトなので、辞書にメソッドを追加することもできます。
辞書では不可能だった(辞書以外の)オブジェクトでできることはありますか?または、特定のクラスのオブジェクトのように完全に見える辞書を設定することは可能ですか?
この質問は、それらがどのように作成されるかではなく、後でどのように使用できるかについてです。リンクや参考資料をいただければ幸いです。
オブジェクトが作成されたら、辞書の場合と同じように、スロットを自由に追加および削除できます。メソッドもスロットに格納されているオブジェクトなので、辞書にメソッドを追加することもできます。
辞書では不可能だった(辞書以外の)オブジェクトでできることはありますか?または、特定のクラスのオブジェクトのように完全に見える辞書を設定することは可能ですか?
この質問は、それらがどのように作成されるかではなく、後でどのように使用できるかについてです。リンクや参考資料をいただければ幸いです。
オブジェクトが作成されたら、辞書の場合と同じように、スロットを自由に追加および削除できます。メソッドでさえ、スロットに格納されたオブジェクトにすぎません。
スロットと言うことに注意してください-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クラスは辞書の単なる構文糖衣であるとさえ言われています。
最近、オブジェクトについて学ぶ必要があるのか、それとも時間を節約して辞書を学ぶだけなのか、という非常によく似た質問がありました。それに対する私の答えもここに関連していると思います。
オブジェクトのメンバー関数を呼び出すと、最初のパラメーターとしてオブジェクト自体が渡されます。このようにして、所属するオブジェクトのプロパティを変更できます。
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では簡単に複製できないオブジェクトタイプ情報を直接使用する機能もあります。
他の答えにはある程度の根拠がありますが、特定の辞書をサブクラス化またはインスタンス化することはできないことを付け加えておきます。
class A(object): pass
class B(A): pass
a = A()
A = {}
B = ???
a = ???
したがって、辞書はオブジェクトであり、オブジェクトは主に辞書を使用して実装されます(詳細はわかりませんが)が、ジョブごとに異なるツールです。
私はあなたがについて尋ねると思います
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"]
。
オブジェクトは、クラスから作成された{}です。
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}