준비
클래스가 새로운 유형인지 확인하려면 모듈 시작 부분에 _metaclass_=type을 넣어야 합니다.
class NewType(Object): mor_code_here class OldType: mor_code_here
이 두 클래스 중 NewType이 새로운 클래스이고 OldType이 추가되면 OldType이 됩니다. front _metaclass_=type에서는 두 클래스가 모두 새 클래스에 속합니다.
생성자 메서드
생성자 메서드는 객체 생성 시 생성자 메서드가 즉시 호출됩니다. Python 생성자를 생성하는 것은 매우 간단합니다. init 메서드를 간단한 init 메서드에서 _init_ 메서드의 매직 버전으로 변환하기만 하면 됩니다.
class FooBar: def __init__(self): self.somevar = 42 >>> f =FooBar() >>> f.somevar 42
일반 메서드 재정의
각 클래스에는 하나 이상의 A 슈퍼클래스( 상위 클래스)는 슈퍼클래스의 동작 메서드를 상속받습니다.
class A: def hello(self): print 'hello . I am A.' class B(A): pass >>> a = A() >>> b = B() >>> a.hello() hello . I am A.
B 클래스에는 hello 메소드가 없으므로 B 클래스는 A 클래스를 상속하므로 A 클래스는 hello 메소드라고 불립니다.
하위 클래스에 기능을 추가하는 가장 기본적인 방법은 메소드를 추가하는 것입니다. 그러나 일부 슈퍼클래스 메서드를 재정의하여 상속된 동작을 맞춤설정할 수도 있습니다. 다음과 같습니다:
class A: def hello(self): print 'hello . I am A.' class B(A): def hello(self): print 'hello . I am B' >>> b = B() >>> b.hello() hello . I am B
특수 및 생성자 메서드
재정의는 상속 메커니즘에 있습니다. 특히 건축 방법에 대한 중요한 내용입니다. 다음 예를 보십시오.
class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaah...' self.hungry = False else: print 'No, thanks!' >>> b = Bird() >>> b.eat() Aaaah... >>> b.eat() No, thanks!
이 클래스는 새가 먹을 수 있는 능력이 있음을 정의합니다. 먹은 후에는 다시 배가 고프지 않게 되는데, 이는 위의 실행 결과를 통해 확실히 알 수 있습니다.
그런 다음 SongBird 클래스를 사용하여 Bird 클래스를 상속하고 여기에 노래 부르기 메서드를 추가합니다.
class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaah...' self.hungry = False else: print 'No, thanks!' class SongBird(Bird): def __init__(self): self.sound = 'Squawk!' def sing(self): print self.sound >>> s = SongBird() >>> s.sing() Squawk! >>> s.eat() Traceback (most recent call last): File "<pyshell#26>", line 1, in <module> s.eat() File "C:/Python27/bird", line 6, in eat if self.hungry: AttributeError: 'SongBird' object has no attribute 'hungry'
예외에는 오류가 명확하게 명시되어 있습니다. SongBird에는 배고픈 기능이 없습니다. 그 이유는 SongBird에서 생성자가 다시 작성되었지만 새 생성자에는 배고픈 속성을 초기화하는 코드가 없기 때문입니다. 원하는 효과를 얻으려면 SongBird의 생성자가 기본 초기화를 보장하기 위해 상위 클래스 Bird의 생성자를 호출해야 합니다.
구현할 두 가지 방법:
1. 바인딩되지 않은 슈퍼클래스 생성자를 호출합니다.
class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaah...' self.hungry = False else: print 'No, thanks!' class SongBird(Bird): def __init__(self): Bird.__init__(self) self.sound = 'Squawk!' def sing(self): print self.sound >>> s = SongBird() >>> s.sing() Squawk! >>> s.eat() Aaaah... >>> s.eat() No, thanks!
SongBird 클래스에 Bird.__init__(self) 코드 줄을 추가했습니다. 인스턴스의 메서드가 호출되면 메서드의 self 매개 변수가 자동으로 인스턴스에 바인딩됩니다(이를 바인딩된 메서드라고 함). 그러나 클래스 메서드를 직접 호출하면 인스턴스가 바인딩되지 않습니다. 이를 통해 필요한 자체 매개변수를 자유롭게 제공할 수 있습니다(이러한 메소드를 바인딩되지 않은 메소드라고 함).
현재 인스턴스를 바인딩 해제된 메서드에 self 매개 변수로 제공함으로써 SongBird는 슈퍼클래스 생성자의 모든 구현을 사용할 수 있으며, 이는 배고픈 속성을 설정할 수 있음을 의미합니다.
2. 슈퍼 기능을 사용하세요
__metaclass__ = type #表明为新式类 class Bird: def __init__(self): self.hungry = True def eat(self): if self.hungry: print 'Aaaah...' self.hungry = False else: print 'No, thanks!' class SongBird(Bird): def __init__(self): super(SongBird,self).__init__() self.sound = 'Squawk!' def sing(self): print self.sound >>> s.sing() Squawk! >>> s.eat() Aaaah... >>> s.eat() No, thanks!
슈퍼 기능은 다음에서만 사용할 수 있습니다. 새로운 스타일의 수업 . 현재 클래스와 객체는 슈퍼 함수의 매개변수로 사용될 수 있습니다. 함수가 반환한 객체를 호출하는 모든 메소드는 현재 클래스가 아닌 슈퍼 클래스의 메소드를 호출합니다. 그런 다음 SongBird 생성자에서 Bird를 사용하는 대신 super(SongBird, self)를 직접 사용할 수 있습니다.
속성
접근자는 getHeight 및 setHeight와 같은 이름을 사용하여 일부 속성을 가져오거나 다시 바인딩할 수 있는 간단한 방법입니다. 특정 기능에 액세스할 때 일부 작업을 수행해야 하는 경우 이와 같은 상태 변수를 캡슐화하는 것이 중요합니다.
class Rectangle: def __init__(self): self.width = 0 self.height = 0 def setSize(self,size): self.width , self.height = size def getSize(self): return self.width , self.height >>> r = Rectangle() >>> r.width = 10 >>> r.height = 5 >>> r.getSize() (10, 5) >>> r.setSize((150,100)) >>> r.width 150
위의 예에서 getSize 및 setSize 메소드는 size라는 가상 속성을 사용합니다. 접근자 메서드, 크기는 너비와 높이로 구성된 튜플입니다.
속성 함수
이전 섹션에서 Rectangle과 같은 클래스를 이미 작성했다면 한 줄만 추가하면 됩니다. 코드:
__metaclass__ = type class Rectangle: def __int__(self): self.width = 0 self.height = 0 def setSize(self,size): self.width, self.height = size def getSize(self): return self.width ,self.height size = property(getSize ,setSize) >>> r = Rectangle() >>> r.width = 10 >>> r.height = 5 >>> r.size (10, 5) >>> r.size = 150,100 >>> r.width 150
이 새 버전의 Retangle에서는 속성 함수가 접근자 함수가 있는 속성을 생성합니다. 매개변수로 사용되며(먼저 값을 가져온 다음 값을 할당함) 이 속성의 이름은 size입니다. 이렇게 하면 더 이상 구현 방법에 대해 걱정할 필요가 없으며 너비, 높이 및 크기를 동일한 방식으로 처리할 수 있습니다.