> 백엔드 개발 > 파이썬 튜토리얼 > 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
로그인 후 복사

를 통해 실행 결과를 보면 C가 A와 B를 상속하므로 A 또는 B의 ma() 메서드를 호출할 수 있지만 A와 B에 동일한 메서드가 있는 경우 우선 순위를 부여한다는 것을 알 수 있습니다. 처음으로 상속받은 슈퍼클래스.

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__은 인쇄 기능에 의해 호출되며 일반적으로 무언가를 반환합니다. 이는 문자열 형태로 표현되어야 합니다. 그렇지 않은 경우 str() 함수를 사용하여 변환하십시오. 클래스를 인쇄할 때 가장 먼저 인쇄가 호출하는 것은 클래스에 정의된 __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. 모듈:
파이썬에는 200개 이상의 모듈이 포함되어 있습니다. 모두의 지속적인 개선과 개선 끝에 이제 공식 웹사이트에서는 원하는 거의 모든 기능을 달성할 수 있는 2,000개 이상의 라이브러리 모듈을 수집했습니다. .
직접 사용할 때는 자체 모듈을 사용할 수도 있습니다. 모든 .py를 별도의 모듈로 가져올 수 있습니다.

이제 먼저 자체 모듈인 py를 정의합니다.

#!/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
로그인 후 복사

동일한 디렉터리에서 Python을 대화형으로 열면 이 모듈을 가져올 수 있습니다.

가져오기 호출을 수행하려면 파일에 쓰세요. , 여기 같은 디렉토리(같은 레이어)에 있습니다


#!/usr/bin/env python
 
import module
module.test()
로그인 후 복사

결과는 다음과 같습니다.

This is a test
로그인 후 복사

개선하고 모듈의 클래스를 호출합니다.

#!/usr/bin/env python
 
import module
h = module.DB()
print h.test()
로그인 후 복사

출력 결과는 다음과 같습니다.

101
로그인 후 복사

다음으로 모듈을 디렉터리로 가져오려고 합니다.

새 디렉터리를 생성하고 heat에 여러 모듈 파일을 작성합니다. it

디렉터리는 다음과 같아야 합니다. __init__.py만 모듈로 가져올 수 있습니다.



Python 학습 객체지향 프로그래밍 특성 (2)
heat 디렉터리에 있는 docker.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 디렉토리에 있는 nova.py의 내용은 다음과 같습니다:

#!/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;
로그인 후 복사

이제 __init__ 파일만 있습니다. heat 디렉토리이고, 파일에 내용이 없습니다

호출 스크립트 파일 작성:

#!/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
로그인 후 복사

이제 디렉터리에서 특정 모듈만 가져올 수 있으며 위와 같이 가져오고 호출할 수 있습니다.

디렉터리의 모든 모듈 파일을 가져오려면 디렉터리의 __init__.py에 다음 내용을 추가할 수 있습니다.

__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()
로그인 후 복사

실행 결과는 다음과 같습니다.

heat.docker
This is a docker in heat
This is a docker in heat
This is a nova
This is a test in nova
로그인 후 복사

필요한 모듈이 있는 경우 디렉터리로 가져오려면 계속해서 그 안에 __init__.py 파일을 작성하고, 디렉터리에 모듈 파일 이름을 쓰고, 호출할 때 추가 디렉터리 계층을 추가하면 됩니다.



Python 학습 객체지향 프로그래밍 특성 (2)다음은 mod.py 파일 내용의 예입니다.

#!/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()
로그인 후 복사

실행 결과는 다음과 같습니다.

hello everyone
This is a test in Hello
로그인 후 복사

모든 모듈 파일이 필요하면 __init__.py 파일에 계속해서 작성하면 됩니다.

파일을 모듈로 가져올 때 .pyc 파일이 생성된다는 점에 유의해야 합니다. 모듈이 변경되면 .pyc 파일을 새로 고쳐야 하며, 그렇지 않으면 이전 정보를 계속 읽습니다. .

파일이 모듈로 사용되는 것을 방지하려면 파일에

을 추가해야 합니다.

if __name__ == &#39;__main__&#39;:
       pass               #这里是要执行的语句
로그인 후 복사


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

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

위 내용은 Python 학습 객체지향 프로그래밍 특성 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿