Latest web development tutorials

Python3 객체 지향

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

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

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


객체 지향 기술 개요

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

그리고 다른 프로그래밍 언어, 새로운 구문과 상황의 의미의 최소한 파이썬은 클래스 메커니즘에 참여한다.

객체 지향 프로그래밍에서 파이썬 클래스는 모든 기본적인 기능을 제공하는 클래스 상속 메커니즘은 여러 개의 기본 클래스를 허용, 어떤 방법을 대체 할 수 있습니다 파생 클래스의 기본 클래스는 동일한 이름의 기본 클래스 메서드를 호출 할 수 있습니다.

객체는 데이터의 수와 유형을 포함 할 수 있습니다.

클래스 정의

다음 구문은 다음과 같습니다

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

클래스가 인스턴스화 된 후에는 클래스를 만든 후, 당신은 클래스 이름을 통해 그 속성에 액세스 할 수 있습니다, 사실, 그 속성을 사용할 수 있습니다.

Class 객체

속성 참조와 인스턴스 : Class 객체가 작업 두 가지를 지원합니다.

참조 모든 속성에 대한 파이썬을 사용하는 속성은 표준구문을 참조 :obj.name합니다.

클래스 객체는 클래스 네임 스페이스 속성을 만든 후 모든 이름은 유효한 이름입니다. 그래서, 클래스 정의는이처럼 보였다 경우 :

#!/usr/bin/python3

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'

# 实例化类
x = MyClass()

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

클래스를 인스턴스화 :

# 实例化类
x = MyClass()
# 访问类的属性和方法

위의 빈 객체를 X 클래스의 새 인스턴스를 생성하고 로컬 변수 x에이 객체를 할당합니다.

위 프로그램의 출력은 다음과 같습니다

MyClass 类的属性 i 为: 12345
MyClass 类的方法 f 输出为: hello world

많은 클래스는 알려진 초기 상태에서 개체를 만드는 것을 좋아합니다. 따라서 클래스는이 같은 이름 __init의 __ () 특수 메소드 (생성자)를 정의 할 수 있습니다 :

def __init__(self):
    self.data = []

클래스 __ __init 정의 () 메소드, 다음의 클래스 인스턴스 운영자는 자동으로 __init __ () 메소드를 호출합니다. 이 예에서는 그래서, 그것은 새로운 인스턴스를 생성 할 수 있습니다 :

x = MyClass()

물론, __init __ () 메소드가 인수를 가질 수있다, 매개 변수 __ ()는 클래스 인스턴스 운영자에게 전달됩니다 __init. 예를 들면 :

>>> class Complex:
...     def __init__(self, realpart, imagpart):
...         self.r = realpart
...         self.i = imagpart
...
>>> x = Complex(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

클래스 메소드

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

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

# 实例化类
p = people('w3big',10,30)
p.speak()

위 프로그램의 출력은 다음과 같습니다

w3big 说: 我 10 岁。

상속

파이썬은 언어 상속을 지원하지 않는다면, 클래스 거의 의미를 가지며, 클래스 상속을 지원한다. 파생 클래스의 정의를 다음과 같이

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>

참고로 괄호 안의 기본 클래스의 순서 기본 클래스는 동일한 방법 이름이되었지만 찾을 왼쪽에서 오른쪽으로, 서브 클래스에서 발견되지 않는 오른쪽 검색 방법 왼쪽에서 서브 파이썬을 지정하지 않고 기본 클래스 메서드가 포함되어 있습니다.

BaseClassName (예 : 기본 클래스 이름) 파생 클래스 범위에 정의해야합니다. 클래스 외에,이 식을 사용하여, 기본 클래스는 매우 유용 다른 모듈에 정의되어있다 :

class DerivedClassName(modname.BaseClassName):

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))



s = student('ken',10,60,3)
s.speak()

위 프로그램의 출력은 다음과 같습니다

ken 说: 我 10 岁了,我在读 3 年级

다중 상속

파이썬은 다중 상속의 제한된 형태를 지원합니다. 다음과 같이 다중 상속 클래스 정의 본다 :

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

참고 괄호 부모 클래스에서 주문, 부모 클래스는 같은 방법으로 이름이있는 경우, 그러나 찾을 왼쪽에서 오른쪽으로, 하위 클래스에없는 바로 검색 방법에 왼쪽에서 서브 클래스, 파이썬을 지정하지 않고 부모 클래스는 메서드가 포함되어 있습니다.

#!/usr/bin/python3

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))

#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))

#另一个类,多重继承之前的准备
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))

#多重继承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法

위 프로그램의 출력은 다음과 같습니다

我叫 Tim,我是一个演说家,我演讲的主题是 Python

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

당신이 당신의 요구를 충족 할 수없는 부모 클래스의 방법입니다 기능, 당신은 하위 클래스에서 상위 클래스 메소드를 다시 작성할 수 있습니다 경우 다음과 같이 예는 다음과 같습니다

#!/usr/bin/python3

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

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

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

위 프로그램의 출력은 다음과 같습니다

调用子类方法

클래스 속성과 메소드

Private 속성 클래스

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

클래스 메소드

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

클래스의 개인 방법

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

클래스의 사유 재산의 예를 다음과 같이 :

#!/usr/bin/python3

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 16, in <module>
    print (counter.__secretCount)  # 报错,实例不能访问私有变量
AttributeError: 'JustCounter' object has no attribute '__secretCount'

클래스의 private 메소드의 예를 다음과 같이 :

#!/usr/bin/python3

class Site:
	def __init__(self, name, url):
		self.name = name       # public
		self.__url = url   # private

	def who(self):
		print('name  : ', self.name)
		print('url : ', self.__url)

	def __foo(self):          # 私有方法
		print('这是私有方法')

	def foo(self):            # 公共方法
		print('这是公共方法')
		self.__foo()

x = Site('本教程', 'www.w3big.com')
x.who()        # 正常输出
x.foo()        # 正常输出
x.__foo()      # 报错

상기 실시 예의 결과 :

클래스의 독점 방법 :

  • __init__ : 생성자는 객체가 생성 될 때 호출된다
  • __del__ : 소멸자, 릴리스 개체
  • __repr__ : 인쇄, 변환
  • __setitem__ : 인덱스 할당에 따라
  • __getitem__ : 지수의 값을 가져옵니다
  • __len__ : 길이를 얻을
  • __cmp__ : 비교 연산
  • __call__ : 함수 호출
  • __add__ : 작업을 추가
  • __sub__ : 뺄셈
  • __mul__ : 곱셈
  • __div__ : 나눗셈 연산
  • __mod__ : 나머지 연산자
  • __pow__ : 수신자

연산자 오버로딩

파이썬은 또한 내가 다음과 같은 예는, 클래스 고유의 메소드를 오버로드 할 수있는 연산자 오버로딩을 지원합니다 :

#!/usr/bin/python3

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)