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')
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__ をトリガーします。関数が実行され、それを使用して独自の特性をカスタマイズできます。各オブジェクトごとに
注意。この自動値転送メカニズムは、インスタンス化に加えて、クラス名
#引用类的数据属性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
の属性参照の機能も持っています。参照する場合、自動的に値が転送されることはありません
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 '__dict__' of 'Chinese' objects>,# '__weakref__': <attribute '__weakref__' of 'Chinese' 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 サイトの他の関連記事を参照してください。