ホームページ > バックエンド開発 > Python チュートリアル > オブジェクト指向プログラミングの特徴を学ぶPython(2)

オブジェクト指向プログラミングの特徴を学ぶPython(2)

巴扎黑
リリース: 2017-04-01 13:34:53
オリジナル
1420 人が閲覧しました

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

最初に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 &#39;__main__.DockerResource&#39;>                    #类型为自己DockerResource
dosker resource test                                   #调用自己的test方法
ログイン後にコピー

クラスでは、最初に独自の構築メソッドが実行されます。そうでない場合は、親クラスから継承し、独自の初期化メソッドを実行します。そうでない場合でも、親クラスから継承し、独自のインスタンス メソッドを通常どおり呼び出すことができます


2. 継承:
以下この例は、サブクラスが親クラスを継承することを示しています

#!/usr/bin/env python
 
class Resource(object):                 #定义一个父类,继承于object基类
 
       def __new__(cls,*args,**kwargs):        #构造方法
                print &#39;class resource __new__&#39;
                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 &#39;sub resource init&#39;
 
       def test(self):
                print &#39;sub resource test&#39;
 
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 &#39;heat init&#39;
 
 
r = Heat()                     #实例化
print r
h = Resource()              #实例化
print h
f = subResource()          #实例化
print f
ログイン後にコピー

実行結果は次のとおりです:

class __new__ <class &#39;__main__.Heat&#39;>               #实例化Heat类,首先执行自己的构造方法和初始化方法,所以先输出构造方法的print语句
heat init                        #执行了自己的初始化方法
<__main__.Heat object at0x7f43349ac050>                     #r实例化后继承的是object基类,打印返回值
class resource __new__                #实例化Resource类,首先执行自己的构造方法和初始化方法,所以先输出构造方法的print语句
<class &#39;__main__.Resource&#39;>         #打印父类构造方法的返回值的类名
call me init for Resource                     #执行自己的初始化方法
<__main__.Resource object at0x7f43349ac090>               # h实例化后继承的是object基类,打印返回值
 
class resource __new__                #实例化subResource类,首先执行父类的构造方法,所以先输出父类构造方法的print语句
<class &#39;__main__.subResource&#39;>           #父类构造方法里面打印自己的类名
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 &#39;a.ma&#39;
       def m(self):
                print &#39;it is A&#39;
class B(object):
       def mb(self):
                print &#39;b.mb&#39;
       def m(self):
                print &#39;it is B&#39;
 
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 = &#39;I can call&#39;
                return s
       def sms(self):
                s = &#39;Are you gua le mei?&#39;
#!/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 = &#39;I can call&#39;
                return s
       def sms(self):
                s = &#39;Are you gua le mei?&#39;
                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 = &#39;install %s&#39; % app
                return s
 
class Huwei(Phone):                    #继承了Phone类,又增加了自己的方法,既拥有超类的方法,又有自己特有的方法
 
       def weixin(self,msg):
                if msg.find(&#39;gcd&#39;) == -1:
                        return &#39;sending....&#39;
                else:
                        return &#39;You can\&#39;t sendthe msg&#39;
 
p = Phone(1.2,&#39;black&#39;,&#39;4M&#39;)                  #实例化
 
iphone =Phones(4.7,&#39;white&#39;,&#39;4G&#39;,&#39;1280*766&#39;)        #实例化
 
h = Huwei(4.7,&#39;yellow&#39;,&#39;4G&#39;)                #实例化
 
print iphone.install_app(&#39;weixin&#39;)          #执行特有的install_app方法
 
print h.sms()
print h.call()
print h.weixin(&#39;wansui&#39;)
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):
       &#39;&#39;&#39;This is a doc                #说明文档
                example for test,please don&#39;tchange it.
       &#39;&#39;&#39;
 
       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):             #当外部出现&#39;==&#39;比较的时候,调用此魔术方法
                return self.__money ==another.__money           #返回两个私有变量的比较结果(布尔值),这里self是&#39;==&#39;左边的参数值,another是右边的参数值
 
       def __gt__(self,another):                     #当外部出现&#39;>&#39;比较的时候,调用此魔术方法
                return self.__money >another.__money             #返回两个私有变量的比较结果(布尔值),这里self是&#39;>&#39;左边的参数值,another是右边的参数值
 
       def __ne__(self,another):             #当外部出现&#39;!=&#39;比较的时候,调用此魔术方法
                return self.__money !=another.__money            #返回两个私有变量的比较结果(布尔值),这里self是&#39;!=&#39;左边的参数值,another是右边的参数值
 
       def __add__(self,another):            #当外部出现&#39;+&#39;运算符的时候,调用此魔术方法
                return self.__money +another.__money      #返回两个私有变量的相加结果,这里self是&#39;!=&#39;左边的参数值,another是右边的参数值
                #returnInformation(&#39;jiaoda&#39;,&#39;dz1302&#39;,self.__money + another.__money)
                #return Information(&#39;jiaoda&#39;,&#39;dz1302&#39;,1024,self.num+ another.num)
 
       def __str__(self):
                return &#39;money = %d&#39; %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(&#39;youdian&#39;,&#39;tg1312&#39;,9999,6)           #实例化
l = Information(&#39;ligong&#39;,&#39;jk1213&#39;,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&#39;This is a test&#39;
 
def test2():
       print&#39;test2&#39;
 
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 ディレクトリに移動し、そこにいくつかの単語を書き込みます モジュール ファイル

は、モジュールとしてインポートされるディレクトリに __init__.py が必要です




heat ディレクトリ内の docker.py の内容は次のとおりです:

101
ログイン後にコピー
オブジェクト指向プログラミングの特徴を学ぶPython(2)

heat ディレクトリ内の nova.py の内容は次のとおりです:

#!/usr/bin/env python
 
def docker():
       return&#39;This is a docker in heat&#39;
 
class Docker(object):
       defcreate_c(self):
              return&#39;1314521aaa&#39;
 
       defstop_c(self):
              return&#39;it is stop&#39;
 
print __name__
 
if __name__ == &#39;__main__&#39;:
       print__name__
       d= Docker()
ログイン後にコピー


Heat ディレクトリにはファイル __init__ のみが存在し、ファイルにはコンテンツはありません

呼び出しスクリプト ファイルを作成します:

#!/usr/bin/env python
 
def nova():
       return&#39;This is a nova&#39;
 
class Nova(object):
       deftest(self):
              return&#39;This is a test in nova&#39;
ログイン後にコピー

実行結果は次のとおりです:

#!/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__ = [&#39;docker&#39;,&#39;nova&#39;]                    #将所有模块名字写入
ログイン後にコピー

実行結果は次のとおりです:

#!/usr/bin/env python
#coding=utf-8
 
import heat.docker               #目录下__init__.py里面没有__all__
print heat.docker.docker()
 
from heat import *               #heat目录下__init__里面内容是:__all__ = [&#39;docker&#39;,nova&#39;]
print docker.docker()
print nova.nova()
n = nova.Nova()
print n.test()
ログイン後にコピー

ディレクトリにインポートする必要があるモジュールがある場合は、引き続き __init__.py ファイルをその中に書き込み、ディレクトリにモジュール ファイルの名前を書き込み、ディレクトリの追加層を追加するを呼び出します。


以下は、内部の mod.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
ログイン後にコピー

テストのために次のスクリプトを実行します: オブジェクト指向プログラミングの特徴を学ぶPython(2)
#!/usr/bin/env python
#coding=utf-8
 
def hello():
       return&#39;hello everyone&#39;
 
class Hello(object):
       def__init__(self):
              self.a= 103
       deftest(self):
              return&#39;This is a test in Hello&#39;
ログイン後にコピー

実行結果は次のとおりです:

#!/usr/bin/env python
#coding=utf-8
 
from heat.common import mod
 
print mod.hello()
h = mod.Hello()
print h.test()
ログイン後にコピー


If内部にすべてのモジュール ファイルが必要です。続行します。__init__.py ファイルに書き込むだけです。


ファイルがモジュールとしてインポートされる場合、.pyc ファイルが生成されることに注意してください。モジュールが変更された場合は、.pyc ファイルを更新する必要があります。そうしないと、古い情報が読み取られることになります。

ファイルがモジュールとして使用されないようにするには、ファイルに

を追加する必要があります

if __name__ == &#39;__main__&#39;:
       pass               #这里是要执行的语句
ログイン後にコピー


这样就可以防止当文件是被用作模块使用时,不会被执行if下面的语句,如果是当做程序来执行时,则会执行下面的语句,一般用作测试。

本文出自 “ptallrights” 博客,请务必保留此出处http://ptallrights.blog.51cto.com/11151122/1793746

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート