ホームページ バックエンド開発 Python チュートリアル Python オブジェクト指向プログラミングの詳細な紹介

Python オブジェクト指向プログラミングの詳細な紹介

Jul 03, 2017 am 09:41 AM
python プログラミング のために

1. オブジェクト指向とは何ですか? オブジェクト指向 (oop) は、世界のすべてをオブジェクトに抽象化することができ、すべてはオブジェクトで構成されます。プログラミングに応用され、オブジェクトをプログラムの基本単位として使用するプログラム開発方法です。

2. オブジェクト指向とプロセス指向の違い

プロセス指向の核心は、プロセスを使用してプログラムを設計するという言葉です。 -指向の手法は、組み立てラインの設計は機械的な考え方に似ています

長所: 複雑な問題が単純化され、合理化されます

短所: スケーラビリティが低い

主なアプリケーションシナリオには、Linux カーネル、git、および http サービスが含まれます

オブジェクト-プログラミングの核心は、機能 (変数) とスキル (関数) の組み合わせであるオブジェクトです。

利点: プログラムの拡張性が低いという問題を解決します

欠点: 制御性が低く、最終結果を予測できません

主なアプリケーションシナリオは、ニーズが頻繁に変化するソフトウェア、つまりユーザーと頻繁に対話するソフトウェアです

すべきこと注意: オブジェクト指向プログラミングはすべての問題を解決するわけではなく、スケーラビリティを解決するためにのみ使用されます。もちろん、今日のインターネット ソフトウェアでは、スケーラビリティが最も重要です

3. オブジェクトとクラスの概念

Python では、オブジェクトはすべて独自の属性、つまり特性を持つ必要があります。関数、つまりメソッド

Pythonでは、特徴は変数で表現され、関数は関数で表現されるので、オブジェクトは変数と関数の組み合わせです

そして、さまざまなオブジェクトから同じ特性、同じ機能を持つオブジェクトが抽出されますはクラスなので、クラスは一連のオブジェクトの共通の特性と機能の組み合わせです

クラスを定義しましょう。メソッドは関数の定義に似ています:

#定义一个中国人的类class Chinese:#共同的特征country='China'#共同的技能def talk(self):print('is talking Chinese')def eat(self):print('is eating Chinese food')
ログイン後にコピー
このようにして、次のようになります。注: 1. クラスを定義するには class キーワードを使用します

2. クラス名の最初の文字は通常大文字で、関数定義とは異なり、コロンの前に括弧は必要ありません

3. 関数とは異なり、クラスは定義フェーズでクラス内のコードを実行します


4. クラスには 2 つの属性があります。共通の特性はデータ属性と呼ばれ、共通の関数は関数属性と呼ばれます

このクラスのオブジェクト?インスタンス化:

p1=Chinese()
p2=Chinese()
ログイン後にコピー
現実世界で何が起こっても、プログラムでは確かに最初にクラスがあり、次にオブジェクトがあると結論付けることができます

インスタンス化を通じて 2 つのオブジェクトを取得しました。はい、しかし、問題は、得られた 2 つのオブジェクトは同じ特性と機能を持っているということですが、すべてのオブジェクトが異なるという概念はまったく矛盾しています。実際、クラスを定義したときに、 __init__() 関数を定義するのを忘れていました。正しい定義方法は次のようになります:

#定义一个中国人的类class Chinese:#共同的特征country='China'#初始化def __init__(self,name,age):
        self.name=name  #每个对象都有自己的名字self.age=age    #每个对象都有自己的年龄#共同的技能def talk(self):print('is talking Chinese')def eat(self):print('is eating Chinese food')#实例化的方式产生一个对象p1=Chinese('zhang',18)
ログイン後にコピー

クラス名と括弧はインスタンス化を意味し、インスタンス化は自動的に __init__ をトリガーします。関数が実行され、それを使用して独自の特性をカスタマイズできます。各オブジェクトごとに

__init__ 関数を定義したときは、括弧内に 3 つのパラメーターがありましたが、呼び出しをインスタンス化するときは 2 つの値だけを渡しました。なぜエラーを報告しないのでしょうか。これは、self の機能は、オブジェクトをインスタンス化するときに、オブジェクト自体を __init__ 関数の最初のパラメータに自動的に渡すことであるためです。もちろん、self は単なる名前です。それを理解するために。

注意。この自動値転送メカニズムは、インスタンス化に加えて、クラス名

#引用类的数据属性print(Chinese.country)  #China#引用类的函数属性# Chinese.talk()#TypeError: talk() missing 1 required positional argument: 'self'print(Chinese.talk) #<function Chinese.talk at 0x000001BC5F13D1E0>Chinese.talk('self')    #is talking Chinese#增加属性Chinese.color='yellow'#删除属性del Chinese.color
ログイン後にコピー

の属性参照の機能も持っています。参照する場合、自動的に値が転送されることはありません

変数を定義したり、関数を定義したりすると、メモリ内にメモリ空間が開かれ、定義された変数(データ属性)も存在します。クラス内の関数 (関数属性) には、.__dict__ メソッドを通じて表示できる名前空間もあります

p1=Chinese('zhang',18)print(Chinese.__dict__)#{'__module__': '__main__', 'country': 'China', '__init__': <function Chinese.__# init__ at 0x000002187F35D158>, 'talk': <function Chinese.talk at 0x000002187F35D1E0>, # 'eat': <function Chinese.eat at 0x000002187F35D268>, '__# dict__': <attribute &#39;__dict__&#39; of &#39;Chinese&#39; objects>,#  '__weakref__': <attribute &#39;__weakref__&#39; of &#39;Chinese&#39; objects>, '__doc__': None}print(p1.__dict__)#{'name': 'zhang', 'age': 18}
ログイン後にコピー

上記のコードに示された結果から、インスタンス化されたオブジェクトの名前空間のみを表示することがわかります。他のオブジェクトに共通する属性を見つけたい場合は、クラスの名前空間でそれらを探す必要があります。もちろん、オブジェクトの名前空間には関数属性がありません。クラス内で探す必要がありますが、別のオブジェクトで指定された関数、それは関数ですか

p1=Chinese('zhang',18)
p2=Chinese('li',19)print(Chinese.talk)#<function Chinese.talk at 0x000001B8A5B7D1E0>print(p1.talk)     #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BD68>>print(p2.talk)     #<bound method Chinese.talk of <__main__.Chinese object at 0x000001B8A5B7BDA0>>
ログイン後にコピー

可以看到,并不是,他们的内存地址都不一样。而且注意bound method,是绑定方法

对象本身只有数据属性,但是Python的class机制将类的函数也绑定到对象上,称为对象的方法,或者叫绑定方法。绑定方法唯一绑定一个对象,同一个类的方法绑定到不同的对象上,属于不同的方法。我们可以验证一下:

当用到这个函数时:类调用的是函数属性,既然是函数,就是函数名加括号,有参数传参数

而对象用到这个函数时,对象没有函数属性,他是绑定方法,绑定方法怎么用呢,也是直接加括号,但不同的是,绑定方法会默认把对象自己作为第一个参数

class Chinese:
    country='China'def __init__(self,name,age):
        self.name=name  
        self.age=age    def talk(self):print('%s is talking Chinese'%self.name)def eat(self):print('is eating Chinese food')

p1=Chinese('zhang',18)
p2=Chinese('li',19)
Chinese.talk(p1)    #zhang is talking Chinesep1.talk()           #zhang is talking Chinese
ログイン後にコピー

只要是绑定方法,就会自动传值!其实我们以前就接触过这个,在python3中,类型就是类。数据类型如list,tuple,set,dict这些,实际上也都是类,我们以前用的方法如l1.append(3),还可以这样写:l1.append(l1,3)

未完待续。。。

以上がPython オブジェクト指向プログラミングの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? LinuxターミナルでPythonバージョンを表示するときに発生する権限の問題を解決する方法は? Apr 01, 2025 pm 05:09 PM

LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? あるデータフレームの列全体を、Python内の異なる構造を持つ別のデータフレームに効率的にコピーする方法は? Apr 01, 2025 pm 11:15 PM

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Pythonパラメーター注釈は文字列を使用できますか? Pythonパラメーター注釈は文字列を使用できますか? Apr 01, 2025 pm 08:39 PM

Pythonパラメーター注釈の代替使用Pythonプログラミングでは、パラメーターアノテーションは、開発者が機能をよりよく理解して使用するのに役立つ非常に便利な機能です...

Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Apr 01, 2025 pm 11:30 PM

Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Pythonスクリプトを書くときは、以前の出力をカーソル位置にクリアするのが一般的です...

Python hourglassグラフ図面:可変未定義エラーを避ける方法は? Python hourglassグラフ図面:可変未定義エラーを避ける方法は? Apr 01, 2025 pm 06:27 PM

Python:Hourglassグラフィック図面と入力検証この記事では、Python NoviceがHourglass Graphic Drawingプログラムで遭遇する可変定義の問題を解決します。コード...

PythonおよびOCRテクノロジーを使用して、複雑な検証コードをクラックしようとする方法は? PythonおよびOCRテクノロジーを使用して、複雑な検証コードをクラックしようとする方法は? Apr 01, 2025 pm 10:18 PM

毎日のネットワークインタラクションでPythonを使用したクラッキング検証コードの調査、検証コードは、自動化されたプログラムの悪意のある操作を防ぐための一般的なセキュリティメカニズムです...

Pythonクロスプラットフォームデスクトップアプリケーション開発:どのGUIライブラリが最適ですか? Pythonクロスプラットフォームデスクトップアプリケーション開発:どのGUIライブラリが最適ですか? Apr 01, 2025 pm 05:24 PM

Pythonクロスプラットフォームデスクトップアプリケーション開発ライブラリの選択多くのPython開発者は、WindowsシステムとLinuxシステムの両方で実行できるデスクトップアプリケーションを開発したいと考えています...

文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? 文字列を介してオブジェクトを動的に作成し、Pythonでメソッドを呼び出す方法は? Apr 01, 2025 pm 11:18 PM

Pythonでは、文字列を介してオブジェクトを動的に作成し、そのメソッドを呼び出す方法は?これは一般的なプログラミング要件です。特に構成または実行する必要がある場合は...

See all articles