オブジェクト指向プログラミングにおけるオブジェクトという用語は、基本的にデータ (プロパティ) の集合と、これらのデータにアクセスして操作できる一連のメソッドとみなすことができます。従来の意味では、「プログラム = データ構造 + アルゴリズム」はカプセル化され、「隠蔽」され、「プログラム = オブジェクト + メッセージ」に単純化されます。オブジェクトはクラスのインスタンスであり、クラスの抽象化をカプセル化する必要があります。カプセル化により、呼び出し元はオブジェクトの構築方法を気にせずにオブジェクトを直接使用できるようになります。
最初に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
#!/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()
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 サイトの他の関連記事を参照してください。