質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

4588閲覧

pythonにおける「全てがオブジェクト」はどのように理解できる??

cupnoodle

総合スコア20

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

2クリップ

投稿2018/12/27 11:55

編集2018/12/27 12:07

pythonでは**「全てがオブジェクトである」という説明を目にしますが、これってどういう意味でしょうか**。

個人的には「全てがオブジェクト」=「全てがクラスまたはインスタンス」=「全てがアトリビュートとメソッドを持つことができる」という意味かと思っているのですが、、だとすると例えば

  1. 関数 = 「アトリビュートが持てるけど定義されていない、メソッドのみのオブジェクト」
  2. 変数 = 「メソッドが持てるけど定義されていない、アトリビュートのみのオブジェクト(実際には型毎のスーパークラスのメソッドが継承されているようですが)」
  3. 実は関数や変数の前のオブジェクト名が省略されている

 (例えばmainオブジェクトみたいなのがあって、main.関数()やmain.変数 が内部的な表記である)

という事かなと思っています。このような理解であっていますでしょうか。

また「全てがオブジェクトではない」言語があるのであれば、逆にどういう考え方なのかオブジェクト以外に何が存在しているのか(新たな概念が存在している?)も気になります。

ご存知の方、宜しくお願いします。

tosba👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cupnoodle

2018/12/27 13:23

ご回答ありがとうございます。 こちらは読んだことがありました。このリンク先を読んでも理解しきれず質問させていただきました。。
guest

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
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cupnoodle

2018/12/27 13:18

全てインスタンスながらも、その小分類としてクラス、関数、変数と呼んでいる、という事ですね。また、def等は糖衣構文なんですね。合点がいきました。 なお、アトリビュートはプロパティやフィールドという意味で記載しています(という事を事を仰ってるのではない??)。 ご回答としては質問1~3のうち、1,2は正しく、3は少し異なる、という事でしょうか。「実行時の名前空間から変数名に対応するインスタンスを探してくるだけ」というのは云わば currentscope.関数() や currentscope.変数 と同じようなものかなとも思いましたが、スコープと「インスタンスの内か外か」を同列視するのは誤りでしょうか。
hayataka2049

2018/12/27 15:00 編集

pythonのスコープは純粋に構文に基づいて決まります。ちなみにglobals, localsといった組み込み関数で名前空間を反映する辞書を取得できます。 また、属性(アトリビュート)は内部的にはオブジェクトの持つ辞書です。__dict__という隠し属性があって、それが実体です(すべての属性が__dict__に含まれるわけではありませんが)。 >>> class Hoge: ... pass ... >>> h = Hoge() >>> h.__dict__ {} >>> h.a = 10 >>> h.__dict__ {'a': 10} >>> h.__dict__["b"] = 20 >>> h.b 20 変数名(関数名、クラス名も基本的にこれに含まれる。まあ関数オブジェクトやクラスオブジェクト自身でも定義時の名前の情報を持っていますが)はオブジェクトとして管理されるのではなく変数名やスコープなどを管理する仕組みに基づいて管理される、オブジェクトの属性はそれとはまた別、ということですね。
maisumakun

2018/12/27 22:45

本題ではありませんが、RubyのクラスはClass.newで作ることもできる、Classクラスのインスタンスです(クラスとして使いやすいように、少し特殊な面があるのは間違いないですが)。
cupnoodle

2018/12/27 23:37

>hayataka2049さん 変数や関数の名前はオブジェクトとして管理されるのでない、という事ですね。 また、一連の中でプロトタイプベース、クラスベースという単語を初めて知りました。勉強になります。 >maisumakunさん ご回答ありがとうございます。 python以外は全く知らない中での質問でしたが、rubyも母体となるクラスが存在するんですね。pythonとの違いは多重継承ができるか否かくらいなのかな?と感じました。 (http://melborne.github.io/2013/02/07/understand-ruby-object/ を参考にしてみました。)
guest

0

全てがオブジェクトではない

代表的なものが C/C++ とか、オブジェクト指向以前の言語全般ですな。
スカラ値が生のママ存在してますね

昔はこれが一般的であって、すべてがオブジェクトというのが新しい概念です

#オブジェクトの定義をどーするかというのもありますが

投稿2018/12/27 12:01

編集2018/12/27 12:04
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cupnoodle

2018/12/27 12:11

>生のママ存在 とは、「全てがオブジェクト」との比較では「メソッドが存在しない変数」という意味でしょうか??
y_waiwai

2018/12/27 12:21

そですね 値、があるだけ。
cupnoodle

2018/12/27 12:49

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問