pythonでは**「全てがオブジェクトである」という説明を目にしますが、これってどういう意味でしょうか**。
個人的には「全てがオブジェクト」=「全てがクラスまたはインスタンス」=「全てがアトリビュートとメソッドを持つことができる」という意味かと思っているのですが、、だとすると例えば
- 関数 = 「アトリビュートが持てるけど定義されていない、メソッドのみのオブジェクト」
- 変数 = 「メソッドが持てるけど定義されていない、アトリビュートのみのオブジェクト(実際には型毎のスーパークラスのメソッドが継承されているようですが)」
- 実は関数や変数の前のオブジェクト名が省略されている
(例えばmainオブジェクトみたいなのがあって、main.関数()やmain.変数 が内部的な表記である)
という事かなと思っています。このような理解であっていますでしょうか。
また「全てがオブジェクトではない」言語があるのであれば、逆にどういう考え方なのか、オブジェクト以外に何が存在しているのか(新たな概念が存在している?)も気になります。
ご存知の方、宜しくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
投稿2018/12/27 12:23
総合スコア13521
0
ベストアンサー
Python的な「すべてがオブジェクト」は「すべてがインスタンス」であることを表します。クラス、関数、メソッドなどもインスタンスの一種に過ぎません。特別な仕掛けがあるのでクラス、関数、メソッドとして使えるだけで。
- 例1:関数の場合
python
1>>> def f(): 2... pass 3... 4>>> f 5<function f at 0x7ff22f5538c8> 6>>> type(f) 7<class 'function'> 8>>> help(type(f)) 9Help on class function in module builtins: 10 11class function(object) 12 | function(code, globals[, name[, argdefs[, closure]]]) 13 | 14 | Create a function object from a code object and a dictionary. 15 | The optional name string overrides the name from the code object. 16 | The optional argdefs tuple specifies the default argument values. 17 | The optional closure tuple supplies the bindings for free variables. 18 | 19 | Methods defined here: 20 | 21 | __call__(self, /, *args, **kwargs) 22 | Call self as a function. 23 | 24 | __get__(self, instance, owner, /) 25 | Return an attribute of instance, which is of type owner. 26 | 27 | __new__(*args, **kwargs) from builtins.type 28 | Create and return a new object. See help(type) for accurate signature. 29 | 30 | __repr__(self, /) 31 | Return repr(self). 32 | 33 | ---------------------------------------------------------------------- 34 | Data descriptors defined here: 35 | 36 | __annotations__ 37 | 38 | __closure__ 39 | 40 | __code__ 41 | 42 | __defaults__ 43 | 44 | __dict__ 45 | 46 | __globals__ 47 | 48 | __kwdefaults__ 49
このように関数はfunction
クラスのインスタンスであり、実際にfunction
クラスのコンストラクタを適切に呼び出すことでインスタンス化して生成できます。def
で書けるのは糖衣構文に過ぎません。
- 例2:クラスの場合
python
1>>> class Hoge: 2... pass 3... 4>>> type(Hoge) 5<class 'type'> 6>>> help(type(Hoge)) 7Help on class type in module builtins: 8 9class type(object) 10 | type(object_or_name, bases, dict) 11 | type(object) -> the object's type 12 | type(name, bases, dict) -> a new type 13 | 14 | Methods defined here: 15 | 16 | __call__(self, /, *args, **kwargs) 17 | Call self as a function. 18 | 19 | __delattr__(self, name, /) 20 | Implement delattr(self, name). 21 | 22 | __dir__(...) 23 | __dir__() -> list 24 | specialized __dir__ implementation for types 25 | 26 | __getattribute__(self, name, /) 27 | Return getattr(self, name). 28 | 29 | __init__(self, /, *args, **kwargs) 30 | Initialize self. See help(type(self)) for accurate signature. 31 | 32 | __instancecheck__(...) 33 | __instancecheck__() -> bool 34 | check if an object is an instance 35 | 36 | __new__(*args, **kwargs) 37 | Create and return a new object. See help(type) for accurate signature. 38 | 39 | __prepare__(...) 40 | __prepare__() -> dict 41 | used to create the namespace for the class statement 42 | 43 | __repr__(self, /) 44 | Return repr(self). 45 | 46 | __setattr__(self, name, value, /) 47 | Implement setattr(self, name, value). 48 | 49 | __sizeof__(...) 50 | __sizeof__() -> int 51 | return memory consumption of the type object 52 | 53 | __subclasscheck__(...) 54 | __subclasscheck__() -> bool 55 | check if a class is a subclass 56 | 57 | __subclasses__(...) 58 | __subclasses__() -> list of immediate subclasses 59 | 60 | mro(...) 61 | mro() -> list 62 | return a type's method resolution order 63 | 64 | ---------------------------------------------------------------------- 65 | Data descriptors defined here: 66 | 67 | __abstractmethods__ 68 | 69 | __dict__ 70 | 71 | __text_signature__ 72 | 73 | ---------------------------------------------------------------------- 74 | Data and other attributes defined here: 75 | 76 | __base__ = <class 'object'> 77 | The most base type 78 | 79 | __bases__ = (<class 'object'>,) 80 | 81 | __basicsize__ = 864 82 | 83 | __dictoffset__ = 264 84 | 85 | __flags__ = 2148291584 86 | 87 | __itemsize__ = 40 88 | 89 | __mro__ = (<class 'type'>, <class 'object'>) 90 | 91 | __weakrefoffset__ = 368 92 93
事情は関数のときと同じで、クラスはtype
クラスのインスタンスに過ぎません。class
で書けるのは糖衣構文です。
(ただしtype
クラスもtype
クラスのインスタンスと考えると破綻しますが、その点については組み込み型なのである種のトリックがあります)。
そしてすべてがインスタンスであるということから、Pythonの変数はすべてJavaでいうところの参照型変数であること、どんなデータであってもGCが等しく同様にメモリ管理を行うことなどが帰結します。
あ、ちなみに「変数名」は構文要素なので「オブジェクト」ではありません。コード上の「名前」に「オブジェクト」を束縛できる仕組みがある、というだけです。
「全てがオブジェクトではない」言語についてですが、まずJavaでいう値型変数(int
など)が挙げられます。あれはC言語の変数と同じような仕組みで、変数がメモリ領域を示す「箱」だと理解できます。関数の引数にすれば値渡しです。Pythonはそうではありません。
また、JavaやRubyでは、クラスやメソッドはPython的な「インスタンス」ではありません(ただし広い意味でのオブジェクトである場合はある)。
値型はともかく、クラスやメソッドまで「インスタンス」とするのはクラスベースのオブジェクト指向言語としては異端です。どちらかといえば、プロトタイプベースのオブジェクト指向言語に糖衣構文をてんこ盛りにして、クラスベースっぽく使えるようにしたと解釈した方がわかりやすいかもしれません。なんのことはない、最近のJavaScriptみたいなものですね。
>「全てがアトリビュートとメソッドを持つことができる」
メソッドはアトリビュートの一種なので、アトリビュートだけあれば良い。
実は関数や変数の前のオブジェクト名が省略されている
(例えばmainオブジェクトみたいなのがあって、main.関数()やmain.変数 が内部的な表記である)
Rubyはそれらしいですが、Pythonの場合は実行時の名前空間から変数名に対応するインスタンスを探してくるだけです。
投稿2018/12/27 12:22
編集2018/12/27 12:57総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/27 15:00 編集
2018/12/27 22:45
2018/12/27 23:37
0
全てがオブジェクトではない
代表的なものが C/C++ とか、オブジェクト指向以前の言語全般ですな。
スカラ値が生のママ存在してますね
昔はこれが一般的であって、すべてがオブジェクトというのが新しい概念です
#オブジェクトの定義をどーするかというのもありますが
投稿2018/12/27 12:01
編集2018/12/27 12:04総合スコア87774
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/27 13:23