Latest web development tutorials

파이썬 객체 지향

처음부터 설계되었습니다 파이썬은 객체 지향 언어이며, 같은 파이썬에서 클래스와 개체가 매우 쉽게 만들 수 있습니다. 우리는 세부 사항 파이썬의 객체 지향 프로그래밍이 섹션.

당신은 객체 지향하는 프로그래밍 언어에 노출되지 않은 경우에, 당신은 첫 번째보다 쉽게 ​​파이썬을 배우는 데 도움이 객체 지향의 기본 개념, 내부의 마음에 형성 객체 지향 언어의 기본 기능 중 일부를 이해할 필요가있다 객체 지향 프로그래밍.

다음의 객체 지향 몇 가지 기본 기능에서의 간단한 이해를 보자.


객체 지향 기술 개요

  • 클래스 (클래스) : 컬렉션을 설명하는 데 사용은 동일한 속성과 개체의 방법이있다. 각 개체에 대한 일반적인 속성과 메소드 세트를 정의합니다. 객체는 클래스의 인스턴스입니다.
  • 클래스 변수 : 클래스 변수는 인스턴스 객체를 통해 일반적이다. 클래스 변수는 정의의 클래스에서 함수 외부. 클래스 변수는 일반적으로 인스턴스 변수로 사용되지 않습니다.
  • 연관된 데이터 처리 클래스 및 인스턴스 오브젝트 클래스 변수 또는 인스턴스 변수 : 데이터 멤버.
  • 오버라이드 (override) : 하위 클래스가 상위 클래스 메소드에서 상속 당신의 요구를 충족 할 수없는 경우는, 프로세스라는 오버레이 방식 (재정의) 다시 또한 재정의 방법으로 알 수있다.
  • 변수의 예에있어서 정의 변수 현재 인스턴스의 클래스의 역할.
  • 상속 : 그 파생 클래스 (파생 클래스는) 기본 클래스 (기본 클래스) 필드와 메소드를 상속한다. 상속은 기본 클래스 개체 치료와 같은 파생 클래스 객체를 할 수 있습니다. 예를 들어, 설계가 : 아날로그 인 동물 개 클래스에서 파생 된 객체 유형은 "A (-A 임)"의 관계 (도 예제, 도그 동물).
  • 인스턴스화 : 클래스, 특정 개체 클래스의 인스턴스를 만듭니다.
  • 방법 : 클래스 정의 함수.
  • 개체 : 클래스 정의를 통해 데이터 구조의 예. 데이터 객체는 두 멤버 (클래스와 인스턴스 변수) 및 방법을 포함한다.

클래스 만들기

수업 후, 새 클래스를 만들려면 클래스 문을 사용하여 클래스 이름은 콜론, 다음 예제로 끝나는 :

class ClassName:
   '类的帮助信息'   #类文档字符串
   class_suite  #类体

도움말 클래스는 클래스 이름 .__ doc__를 볼 수 있습니다.

클래스, 메소드의 위원으로 구성 class_suite, 데이터 속성.

다음은 간단한 파이썬 클래스의 인스턴스입니다 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
   '所有员工的基类'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
  • empCount 변수의 값은이 클래스의 모든 인스턴스간에 공유됩니다, 클래스 변수입니다. 당신은 클래스 또는 외부 클래스 내 Employee.empCount 액세스를 사용할 수 있습니다.
  • 메소드를 호출 할이 클래스의 인스턴스를 생성 할 때 첫 번째 방법의 __init의 __ () 메소드는 특별한 방법, 생성자 또는 클래스 초기화 메소드가 불려한다

개체의 인스턴스를 만듭니다

클래스의 인스턴스를 만들려면 클래스의 이름을 사용하고, 매개 변수 __init__ 방법을 받아 들일 수 있습니다.

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)

액세스 속성

당신은 객체에 액세스하려면 도트 (.) 속성을 사용할 수 있습니다. 다음 클래스의 이름으로 클래스 변수에 :

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

전체 예제 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
   '所有员工的基类'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

출력 결과는 다음과 같습니다 위의 코드를 실행합니다 :

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

다음과 같이 클래스의 속성을 추가, 삭제, 수정할 수 있습니다 :

emp1.age = 7  # 添加一个 'age' 属性
emp1.age = 8  # 修改 'age' 属性
del emp1.age  # 删除 'age' 属性

또한 특성은 다음과 같은 기능을 사용하여 액세스 할 수 있습니다 :

  • getattr (OBJ, 이름 [, 기본값]) : 속성 액세스 개체입니다.
  • 으로 hasattr (OBJ, 이름) : 속성이 있는지 여부를 확인합니다.
  • 않은 setattr (OBJ, 이름, 값) : 속성을 설정합니다. 속성이 없으면, 새로운 특성을 생성한다.
  • delattr (OBJ, 이름) : 속성을 삭제합니다.
hasattr(emp1, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

파이썬 내장 클래스 속성

  • __dict__ : 클래스의 특성 (사전 포함한 데이터 클래스 속성 조성물)
  • __doc__ : 문서 문자열 클래스
  • __name__ : 클래스 이름
  • __module__ : 모듈 클래스 정의 (전체 이름이 '. __main __ 클래스 이름'하고, 클래스가 가져온 모듈 mymod를에있는 경우, 다음 클래스 명 .__ module__ 동일 mymod를) 여기서
  • __bases__ (모든 투플 이루어진 상위 클래스를 포함) 부모 요소의 모든 클래스

파이썬 호출 내장 클래스 속성의 예는 다음과 같습니다 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
   '所有员工的基类'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

출력 결과는 다음과 같습니다 위의 코드를 실행합니다 :

Employee.__doc__: 所有员工的基类
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}

파이썬 객체가 파괴 (가비지 컬렉션)

자바 언어와 마찬가지로 파이썬은 참조 메모리에 객체를 추적하는이 간단한 기술을 카운트를 사용합니다.

참조의 각 숫자를 사용하여 모든 오브젝트의 파이썬 내부 기록합니다.

내부 추적 변수는 참조 카운터라고.

객체가 생성되면 가비지 수집하고, 객체가 더 이상 필요하지 않으면, 즉 개체 수에 대한 참조는 0이되고, 대답없는, 기준 카운트를 생성한다. 그러나, 복구가 적절한 시간에 인터프리터 "즉시"아니다 가비지 객체는 메모리 공간의 교정을 점유한다.

a = 40      # 创建对象  <40>
b = a       # 增加引用, <40> 的计数
c = [b]     # 增加引用.  <40> 的计数

del a       # 减少引用 <40> 的计数
b = 100     # 减少引用 <40> 的计数
c[0] = -1   # 减少引用 <40> 的计数

오브젝트 레퍼런스 카운트뿐만 가비지 콜렉션기구 동일한는 순환 참조하는 경우를 처리 할 수있는 0이다. 그것은 순환 참조 지칭 두 개체가 서로를 참조 없지만, 다른 변수들을 참조. 이 경우, 참조 횟수가 충분하지 않다. 파이썬의 가비지 컬렉터 실제로 사이클 카운터와 가비지 컬렉터에 대한 참조입니다. 전체 양에주의를 지불하는 보충 참조 카운팅 가비지 콜렉터가 큰 개체를 할당으로 (참고로 파괴들을 계산하지 않음). 이 경우, 인터프리터는 모든 참조되지 않은 사이클을 정리하려고 일시 중지됩니다.

소멸자 __del__, __ del__는 객체가 더 이상 실행, __ del__ 방법을 사용하면, 객체가 소멸 될 때 호출되지 않는다 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "销毁"

pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1
del pt2
del pt3

다음, 상기 결과의 예 :

3083401324 3083401324 3083401324
Point 销毁

주 : 일반적으로는 별도의 파일에서 클래스를 정의 할 필요

클래스 상속

객체 지향 프로그래밍의 주요 이점 중 하나는 이들 중 하나가 상속기구 통해 달성하는 코드 재사용을 재사용하게된다. 으로 클래스 사이 완전히 이해할 종류와 하위 관계를 물려 받았다.

주의 : 상속 구문 클래스 파생 된 클래스 이름 (기본 클래스 명) : // ... 기본 클래스는 특정 튜플 중에서, 클래스 정의 경우, 대괄호 기본 클래스 이름을 쓰는.

일부 기능의 파이썬 연속 :

  • 1 : 다음과 같은 구성에서 (__init __ () 메소드) 쳉 Zhongji 클래스는 자동으로 개인적으로 파생 클래스의 생성자에서 호출 전문화 필요가 호출되지 않습니다.
  • 2 : 기본 클래스의 메소드를 호출 할 때, 기본 클래스의 클래스 이름 프리픽스, 자기 매개 변수를 가지고 필요성을 추가 할 필요가있다. 자기 매개 변수를 가져올 필요가없는 것은 클래스의 일반 함수 호출과 다른
  • 3 : 파생 클래스에 대응하는 방법을 찾을 수없는 경우 파이썬은 항상 먼저, 접근의 해당 유형을 발견, 그것은 기본 클래스에 하나 하나보고 시작했다. (첫 번째 방법은 기본 클래스를 찾기 위해 찾아,이 클래스에서 찾을 호출).

열 상속 튜플에 하나 이상의 클래스한다면, 그것은 "다중 상속"이라고합니다.

구문 :

다음과 같이 도출 된 클래스의 선언, 상위 클래스와 비슷하고, 클래스 이름을 가진 기본 클래스에서 상속 :

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

예 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:        # 定义父类
   parentAttr = 100
   def __init__(self):
      print "调用父类构造函数"

   def parentMethod(self):
      print '调用父类方法'

   def setAttr(self, attr):
      Parent.parentAttr = attr

   def getAttr(self):
      print "父类属性 :", Parent.parentAttr

class Child(Parent): # 定义子类
   def __init__(self):
      print "调用子类构造方法"

   def childMethod(self):
      print '调用子类方法 child method'

c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法
c.getAttr()          # 再次调用父类的方法

다음과 같이 위의 코드가 실행된다 :

调用子类构造方法
调用子类方法 child method
调用父类方法
父类属性 : 200

여러 클래스를 상속 할 수 있습니다

class A:        # 定义类 A
.....

class B:         # 定义类 B
.....

class C(A, B):   # 继承类 A 和 B
.....

당신은 감지 issubclass () 또는 isinstance () 메서드를 사용할 수 있습니다.

  • - issubclass () 부울 함수는 클래스가 다른 클래스 또는 하위 클래스 구문의 서브 클래스인지 여부를 확인하려면 다음 issubclass가 (서브, SUP)
  • isinstance (OBJ, 클래스) 부울 함수 obj가 객체 클래스 또는 인스턴스 객체 클래스 클래스의 인스턴스 인 경우는 서브 클래스가 true를 돌려주는 것입니다.

메소드의 오버라이드 (override)

상위 클래스의 방법입니다 기능은 여러분의 필요를 충족 할 수없는 경우, 당신은 하위 클래스에서 상위 클래스 메소드를 다시 작성할 수 있습니다 :

예 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:        # 定义父类
   def myMethod(self):
      print '调用父类方法'

class Child(Parent): # 定义子类
   def myMethod(self):
      print '调用子类方法'

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

출력 결과는 다음과 같습니다 위의 코드를 실행합니다 :

调用子类方法

재단 오버로드 된 메서드

다음 표는 클래스에서 오버라이드 (override) 할 수있는 일반적인 기능의 일부 목록 :

아니오. 방법 설명 단순히 호출 및
(1) __init__ (자기 [인수 ...] )
간단하게 생성자메소드를호출 OBJ = 클래스 명 (인수)
__del __ (자기)
소멸자는 객체 간단한 메서드호출을삭제:델 OBJ를
3 __repr __ (자기)
인터프리터의 형태의 변환은 간단한 메서드호출읽기:에repr (OBJ)를
4 __str __ (자기)
STR (OBJ):인간의 독서 간단한 메서드호출에적합한 형태로 값에 대한
(5) __cmp__ (자기, 배)
비교적 간단한 메서드호출개체:CMP를 (OBJ, 배)

연산자 오버로딩

파이썬은 또한 다음과 같은 예는, 연산자 오버로딩을 지원합니다 :

#!/usr/bin/python

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print v1 + v2

다음과 같이 위의 코드의 실행 결과는 다음과 같습니다

Vector(7,8)

클래스 속성과 메소드

Private 속성 클래스

__private_attrs : 속성이 개인이며, 사용 또는 외부 클래스에 직접 액세스 할 수 없다는 두 개의 밑줄을 시작. 자기 .__ private_attrs는 클래스 메소드 내에서 사용하는 경우.

클래스 메소드

지상파 내부에서 사용 DEF 키워드가 다른 기능의 일반적인 정의에 클래스 방법으로 정의 될 수 있으며, 클래스 메소드 파라미터 자체를 포함해야 첫번째 매개 변수

클래스의 개인 방법

__private_method : 클래스의 민간 방법은 외부에서 호출 할 수있는 첫 번째 두 밑줄,이 방법은 선언된다. 클래스 내에서 자기 .__ private_methods를 호출

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class JustCounter:
	__secretCount = 0  # 私有变量
	publicCount = 0    # 公开变量

	def count(self):
		self.__secretCount += 1
		self.publicCount += 1
		print self.__secretCount

counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount  # 报错,实例不能访问私有变量

클래스의 이름을 포함하는 이름을 변경하여 파이썬 :

1
2
2
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print counter.__secretCount  # 报错,实例不能访问私有变量
AttributeError: JustCounter instance has no attribute '__secretCount'

파이썬은 인스턴스화 클래스 액세스 개인 정보를 사용할 수 없습니다,하지만 당신은 object._className__attrName 액세스 속성을 사용할 수있는 코드 위의 코드의 마지막 줄을 대체 할 다음 코드 :

.........................
print counter._JustCounter__secretCount

다음과 같이 위의 코드를 실행, 실행 결과는 다음과 같습니다

1
2
2
2