파이썬 객체 지향
처음부터 설계되었습니다 파이썬은 객체 지향 언어이며, 같은 파이썬에서 클래스와 개체가 매우 쉽게 만들 수 있습니다. 우리는 세부 사항 파이썬의 객체 지향 프로그래밍이 섹션.
당신은 객체 지향하는 프로그래밍 언어에 노출되지 않은 경우에, 당신은 첫 번째보다 쉽게 파이썬을 배우는 데 도움이 객체 지향의 기본 개념, 내부의 마음에 형성 객체 지향 언어의 기본 기능 중 일부를 이해할 필요가있다 객체 지향 프로그래밍.
다음의 객체 지향 몇 가지 기본 기능에서의 간단한 이해를 보자.
객체 지향 기술 개요
- 클래스 (클래스) : 컬렉션을 설명하는 데 사용은 동일한 속성과 개체의 방법이있다. 각 개체에 대한 일반적인 속성과 메소드 세트를 정의합니다. 객체는 클래스의 인스턴스입니다.
- 클래스 변수 : 클래스 변수는 인스턴스 객체를 통해 일반적이다. 클래스 변수는 정의의 클래스에서 함수 외부. 클래스 변수는 일반적으로 인스턴스 변수로 사용되지 않습니다.
- 연관된 데이터 처리 클래스 및 인스턴스 오브젝트 클래스 변수 또는 인스턴스 변수 : 데이터 멤버.
- 오버라이드 (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