オブジェクト指向プログラミングの特徴を学ぶPython(2)
オブジェクト指向プログラミングにおけるオブジェクトという用語は、基本的にデータ (プロパティ) の集合と、これらのデータにアクセスして操作できる一連のメソッドとみなすことができます。従来の意味では、「プログラム = データ構造 + アルゴリズム」はカプセル化され、「隠蔽」され、「プログラム = オブジェクト + メッセージ」に単純化されます。オブジェクトはクラスのインスタンスであり、クラスの抽象化をカプセル化する必要があります。カプセル化により、呼び出し元はオブジェクトの構築方法を気にせずにオブジェクトを直接使用できるようになります。
最初にPythonのプログラミング仕様を説明します:
#!/usr/bin/env python #coding=utf-8 #编程规范,示例如下: class ClassName(object): '''testdoc #这里面是一些说明文档,该类的说明信息是可以被help看到的 example: ''' #注释的写法,可以在后面,也可以在上一行,单行注释以#号开头 a= 100 #this is a number for a #thisis a number for b b= 200 c= ['a','b'] #or 分行写 d= { #列表、字典等可以分行写,这样更加直观 'key1':'v1', 'key2':'v2', 'key3':'v3' } def__init__(self,num,m): #初始化方法。如果不写,则是从基类继承 self.age= num self.__money= m deftest(self): return100 def__eq__(self,other): #魔术方法 returnself.age == other.age def__del__(self): #析构函数,在整个类调用执行完后会执行 print'world' d = Hello(2,200) d2 = Hello(3,100) print d == d2 #会自动调用__eq__方法,返回比较结果 print d print d2
仕様の記述には、一般に説明テキスト、初期化メソッド、単一または複数行のコメントなどが含まれます。
1.構築方法:
以下の例は、構築メソッドと初期化メソッドの実行順序を示しています。
#!/usr/bin/env python class Of(object): def __new__(cls,*args,**kwargs): #构造方法 print 'new' return super(Of,cls).__new__(cls,*args,**kwargs) #returnobject.__new__(cls,*args,**kwargs) def __init__(self): #初始化方法 print "init" def test(self): print 'hello' f = Of()
実行結果は次のとおりです。
new init
は、クラスがインスタンス化されるときに、最初にコンストラクター メソッドが実行され、次に初期化メソッドが実行されることを示しています。実行される
次の例は、コンストラクター メソッドと初期化メソッドの違いを示しています:
#!/usr/bin/env python class Resource(object): #父类的定义 def __init__(self): #初始化方法,为了说明这里直接输出名字 print 'call me resource init' def __new__(cls,*args,**kwargs): #构造方法,这里使用这种传参可以接受任何类型的参数 print "resource new" returnobject.__new__(cls,*args,**kwargs) #返回值为object基类的构造方法的返回值 class DockerResource(Resource): #子类的定义,继承了Resource类 def __new__(cls,*args,**kwargs): #重新构造自己的构造方法 print "call me dockerresource new" returnResource.__new__(cls,*args,**kwargs) #返回值为Resource父类的构造方法的返回值 def __init__(self): #定义自己的初始化方法 print 'call docker resourceinit' def test(self): #定义test方法 print 'dosker resource test' r = DockerResource() #实例化DockerResource,并将返回值传递给r print r #打印r,查看返回值是什么 print type(r) #查看r的类型 r.test()
出力結果は次のとおりです:
call me docker resource new #首先调用了DockerResource的构造方法 resource new #构造方法返回的是Resource的构造方法,所以会执行Resource父类构造方法的print "resource new" call docker resource init #然后会执行自己的初始化方法 <__main__.DockerResource object at0x7fa1a3edcf90> #r现在接受的是Resource父类的构造方法的返回值,所以会有object出现 <class '__main__.DockerResource'> #类型为自己DockerResource dosker resource test #调用自己的test方法
クラスでは、最初に独自の構築メソッドが実行されます。そうでない場合は、親クラスから継承し、独自の初期化メソッドを実行します。そうでない場合でも、親クラスから継承し、独自のインスタンス メソッドを通常どおり呼び出すことができます
2. 継承:
以下この例は、サブクラスが親クラスを継承することを示しています
#!/usr/bin/env python class Resource(object): #定义一个父类,继承于object基类 def __new__(cls,*args,**kwargs): #构造方法 print 'class resource __new__' obj =super(Resource,cls).__new__(cls,*args,**kwargs) #利用super函数找到自己的父类,并将它的构造方法传递给obj print obj.__class__ #打印obj的类型 return obj #返回值为obj def __init__(self): #初始化方法 print "call me init forResource" def test(self): print "call me test forResource" def create(self): print "call me create forResource" class subResource(Resource): #定义子类,继承Resource父类 def __init__(self): #定义自己的初始化方法 print 'sub resource init' def test(self): print 'sub resource test' class Heat(object): #定义一个Heat类,继承于基类object,是个新式类 def __new__(cls,*args,**kwargs): #定义自己的构造方法 print "class __new__%s" % cls returnobject.__new__(cls,*args,**kwargs) #返回值为object基类的构造方法的返回值 def __init__(self): #定义初始化方法 print 'heat init' r = Heat() #实例化 print r h = Resource() #实例化 print h f = subResource() #实例化 print f
実行結果は次のとおりです:
class __new__ <class '__main__.Heat'> #实例化Heat类,首先执行自己的构造方法和初始化方法,所以先输出构造方法的print语句 heat init #执行了自己的初始化方法 <__main__.Heat object at0x7f43349ac050> #r实例化后继承的是object基类,打印返回值 class resource __new__ #实例化Resource类,首先执行自己的构造方法和初始化方法,所以先输出构造方法的print语句 <class '__main__.Resource'> #打印父类构造方法的返回值的类名 call me init for Resource #执行自己的初始化方法 <__main__.Resource object at0x7f43349ac090> # h实例化后继承的是object基类,打印返回值 class resource __new__ #实例化subResource类,首先执行父类的构造方法,所以先输出父类构造方法的print语句 <class '__main__.subResource'> #父类构造方法里面打印自己的类名 sub resource init #执行自己的初始化方法 <__main__.subResource object at0x7f43349ac0d0> #f实例化后是执行了父类Resource类的构造方法,返回的依旧是object基类
3. 多重継承:
#!/usr/bin/env python class A(object): def __init__(self): pass def ma(self): print 'a.ma' def m(self): print 'it is A' class B(object): def mb(self): print 'b.mb' def m(self): print 'it is B' class C(A,B): pass c = C() c.ma() c.mb() c.m()
実行結果は次のとおりです:
a.ma b.mb it is A
Through the実行結果を見ると、C は A と B を継承していることがわかります。そのため、A の ma() メソッドと B の mb() メソッドを呼び出すことができますが、A と B に同じメソッドがある場合、最初に継承した super が優先されます。クラス。
4. 継承とオーバーロード:
#!/usr/bin/env python class Phone(object): def __init__(self,size,color,memory): self.size = size self.color = color self.memory = memory def call(self): s = 'I can call' return s def sms(self): s = 'Are you gua le mei?' #!/usr/bin/env python class Phone(object): def __init__(self,size,color,memory): self.size = size self.color = color self.memory = memory def call(self): s = 'I can call' return s def sms(self): s = 'Are you gua le mei?' return s class Phones(Phone): #继承了Phone类,重载了自己的初始化方法,又增加了自己的方法,既拥有超类的方法,又有自己特有的方法 def __init__(self,size,color,memory,pix): self.pix = pix super(Phones,self).__init__(size,color,memory) def install_app(self,app): s = 'install %s' % app return s class Huwei(Phone): #继承了Phone类,又增加了自己的方法,既拥有超类的方法,又有自己特有的方法 def weixin(self,msg): if msg.find('gcd') == -1: return 'sending....' else: return 'You can\'t sendthe msg' p = Phone(1.2,'black','4M') #实例化 iphone =Phones(4.7,'white','4G','1280*766') #实例化 h = Huwei(4.7,'yellow','4G') #实例化 print iphone.install_app('weixin') #执行特有的install_app方法 print h.sms() print h.call() print h.weixin('wansui') sms = p.sms() call = p.call() print sms,call
実行結果は次のとおりです:
install weixin Are you gua le mei? I can call sending.... Are you gua le mei? I can call
メソッドのオーバーロードは、実際にはクラス内で def キーワードを使用して、親クラスのメソッドをオーバーロードします。親クラスのメソッドをオーバーロードするが、クラス内で親クラスのメソッドを使用する必要がある場合は、親クラス名に「.」とメソッド名を付けて呼び出すことができます
5. マジック メソッド:
#!/usr/bin/env python class Information(object): '''This is a doc #说明文档 example for test,please don'tchange it. ''' def __init__(self,sch,cla,m,n): #定义初始化方法 print "welecome to schoolsystem." self.school = sch #实例变量 self.classroom = cla #实例变量 self.num = 100 #实例变量 self.__money = m #私有变量 self.num = n #实例变量 def school_name(self): #返回实例变量,即将实例变量传递出去 return self.school def class_name(self): #返回实例变量,即将实例变量传递出去 return self.classroom def class_money(self): #返回私有变量,即将私有变量传递出去 return self.__money #魔术方法:以双下划线开头,以双下划线结尾的方法是魔术方法 def __eq__(self,another): #当外部出现'=='比较的时候,调用此魔术方法 return self.__money ==another.__money #返回两个私有变量的比较结果(布尔值),这里self是'=='左边的参数值,another是右边的参数值 def __gt__(self,another): #当外部出现'>'比较的时候,调用此魔术方法 return self.__money >another.__money #返回两个私有变量的比较结果(布尔值),这里self是'>'左边的参数值,another是右边的参数值 def __ne__(self,another): #当外部出现'!='比较的时候,调用此魔术方法 return self.__money !=another.__money #返回两个私有变量的比较结果(布尔值),这里self是'!='左边的参数值,another是右边的参数值 def __add__(self,another): #当外部出现'+'运算符的时候,调用此魔术方法 return self.__money +another.__money #返回两个私有变量的相加结果,这里self是'!='左边的参数值,another是右边的参数值 #returnInformation('jiaoda','dz1302',self.__money + another.__money) #return Information('jiaoda','dz1302',1024,self.num+ another.num) def __str__(self): return 'money = %d' %self.__money def __hash__(self): #获取hash值 return 1314521 def __getattr__(self,name): #当调用不存在的方法时,执行此方法进行输出 print "get attr %s" %name return name def __del__(self): #析构方法,当不再使用此类时,会自动执行 print "Goodbye,welecomhere again." f = Information('youdian','tg1312',9999,6) #实例化 l = Information('ligong','jk1213',6666,4) #实例化 print f == l #调用魔术方法__eq__() print f + l #调用魔术方法__add__() print f > l #调用魔术方法__gt__() s = f + l # print s print f.ccc #名字不存在,调用__getatter__()方法
__str__ は print 関数によって呼び出され、通常は何かを返します。これは文字列の形式で表現する必要があります。そうでない場合は、str() 関数を使用して変換します。クラスを出力するとき、print はクラスで定義された __str__ を最初に呼び出します。実行結果は次のとおりです:
welecome to school system. #首先会在实例化的时候执行初始化方法 welecome to school system. #第二次实例化调用初始化方法 False #打印__eq__()的返回值为False 16665 #打印__add__()的返回值为两数相加 True #打印__gt__()的返回值为True 16665 get attr ccc #执行__getattr__()方法 ccc Goodbye,welecom here again. #执行完会自动执行析构函数 Goodbye,welecom here again.
6. モジュール:
Python には 200 を超えるモジュールが付属しています。皆さんの継続的な改善と改善により、公式 Web サイトには 2,000 を超えるライブラリ モジュールが収集され、必要なほぼすべての機能を実現できます。 自分で使用する場合は、独自のモジュールを使用することもできます。任意の .py を別のモジュールとしてインポートできます。
次に、同じディレクトリに独自のモジュールを定義します。 Python を対話的に開くと、このモジュールをインポートできます。名前はファイル モジュールの名前です。
インポート呼び出しを行うファイルに書き込みます。これは同じディレクトリ (同じレイヤー) にあります
#!/usr/bin/env python #coding=utf-8 def test(): print'This is a test' def test2(): print'test2' class DB(object): def__init__(self): self.a= 101 deftest(self): returnself.a
結果は次のとおりです:
#!/usr/bin/env python import module module.test()
それを改善し、モジュール内のクラスを呼び出します:
This is a test
出力結果は次のとおりです:
#!/usr/bin/env python import module h = module.DB() print h.test()
次に、ディレクトリにモジュールをインポートしてみます:
新しいファイルを作成しますheat ディレクトリに移動し、そこにいくつかの単語を書き込みます モジュール ファイル
heat ディレクトリ内の docker.py の内容は次のとおりです:
101

heat ディレクトリ内の nova.py の内容は次のとおりです:
#!/usr/bin/env python def docker(): return'This is a docker in heat' class Docker(object): defcreate_c(self): return'1314521aaa' defstop_c(self): return'it is stop' print __name__ if __name__ == '__main__': print__name__ d= Docker()
Heat ディレクトリにはファイル __init__ のみが存在し、ファイルにはコンテンツはありません
呼び出しスクリプト ファイルを作成します:
#!/usr/bin/env python def nova(): return'This is a nova' class Nova(object): deftest(self): return'This is a test in nova'
実行結果は次のとおりです:
#!/usr/bin/env python #coding=utf-8 import heat.docker #目录下__init__.py里面没有__all__ printheat.docker.docker()
これで、ディレクトリ内のファイルのみをインポートできます。上記のように特定のモジュールがインポートされ、呼び出されます。
ディレクトリ内のすべてのモジュールファイルをインポートするには、次の内容を追加できます。ディレクトリ内の __init__.py に変更します:
heat.docker This is a docker in heat This is a docker in heat
__all__ = ['docker','nova'] #将所有模块名字写入
実行結果は次のとおりです:
#!/usr/bin/env python #coding=utf-8 import heat.docker #目录下__init__.py里面没有__all__ print heat.docker.docker() from heat import * #heat目录下__init__里面内容是:__all__ = ['docker',nova'] print docker.docker() print nova.nova() n = nova.Nova() print n.test()
ディレクトリにインポートする必要があるモジュールがある場合は、引き続き __init__.py ファイルをその中に書き込み、ディレクトリにモジュール ファイルの名前を書き込み、ディレクトリの追加層を追加するを呼び出します。
heat.docker This is a docker in heat This is a docker in heat This is a nova This is a test in nova
テストのために次のスクリプトを実行します:

#!/usr/bin/env python #coding=utf-8 def hello(): return'hello everyone' class Hello(object): def__init__(self): self.a= 103 deftest(self): return'This is a test in Hello'
実行結果は次のとおりです:
#!/usr/bin/env python #coding=utf-8 from heat.common import mod print mod.hello() h = mod.Hello() print h.test()
ファイルがモジュールとしてインポートされる場合、.pyc ファイルが生成されることに注意してください。モジュールが変更された場合は、.pyc ファイルを更新する必要があります。そうしないと、古い情報が読み取られることになります。
ファイルがモジュールとして使用されないようにするには、ファイルに
を追加する必要があります
if __name__ == '__main__': pass #这里是要执行的语句
这样就可以防止当文件是被用作模块使用时,不会被执行if下面的语句,如果是当做程序来执行时,则会执行下面的语句,一般用作测试。
本文出自 “ptallrights” 博客,请务必保留此出处http://ptallrights.blog.51cto.com/11151122/1793746
以上がオブジェクト指向プログラミングの特徴を学ぶPython(2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。
