Python 객체 지향 방법의 차이점

爱喝马黛茶的安东尼
풀어 주다: 2019-06-24 13:49:16
원래의
2876명이 탐색했습니다.

Python은 처음부터 객체지향 언어였기 때문에 Python에서는 클래스와 객체를 쉽게 만들 수 있습니다.

메서드에는 인스턴스 메서드, 정적 메서드 및 클래스 메서드가 포함됩니다. 세 가지 메서드는 모두 메모리의 클래스에 속합니다. 차이점은 서로 다른 호출 메서드에 있습니다.

인스턴스 메서드: 개체에 의해 호출됩니다. 일반 메서드를 실행할 때 해당 메서드를 호출하는 개체는 자동으로 self에 할당됩니다. 클래스에 의해 호출됨, 클래스 메소드를 실행하면 해당 메소드를 호출하는 클래스가 자동으로 cls에 복사됩니다.

Static 메소드: 기본 매개변수가 없습니다.

Python 객체 지향 방법의 차이점

인스턴스 메서드

class Kls(object):
    def __init__(self, data):
        self.data = data
    def printd(self):
        print(self.data)
ik1 = Kls('leo')
ik2 = Kls('lee')
ik1.printd()
ik2.printd()
로그인 후 복사

출력:

leo 
lee
로그인 후 복사

위의 예에서 printd는 인스턴스 메소드입니다. 인스턴스 메소드의 첫 번째 매개변수는 self입니다. ik1.printd()를 사용하여 인스턴스 메소드를 호출하면 인스턴스 ik1이 self 매개변수에 전달되므로 self 매개변수는 현재 인스턴스 메소드를 호출하는 인스턴스를 참조할 수 있습니다. 위의 코드는 인스턴스 메서드의 이러한 기능을 활용하여 두 인스턴스의 멤버 데이터를 올바르게 출력합니다.

관련 추천: "

Python 비디오 튜토리얼

"

수업 방법

Python의 클래스 메소드는 데코레이터 @classmethod를 사용하여 정의됩니다. 예제를 직접 살펴보겠습니다.

class Kls(object):
    num_inst = 0
    def __init__(self):
        Kls.num_inst = Kls.num_inst + 1
    @classmethod
    def get_no_of_instance(cls):
        return cls.num_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()
로그인 후 복사

Output:

2 
2
로그인 후 복사

위의 예에서는 Kls 클래스의 인스턴스 수를 계산해야 하므로 인스턴스 수를 저장하기 위해 클래스 변수 num_inst가 정의됩니다. . 데코레이터 @classmethod를 사용하여 get_no_of_instance 메소드가 클래스 메소드로 정의됩니다. 클래스 메서드를 호출할 때 Python은 클래스 변수 num_inst가 get_no_of_instance 내에서 참조될 수 있도록 클래스(클래스 Kls)를 cls에 전달합니다.

클래스 메소드 호출 시 타입 자체를 클래스 메소드에 전달하기만 하면 되기 때문에 클래스 메소드는 클래스를 통해서 호출할 수도 있고 인스턴스를 통해서도 호출할 수 있습니다.

static method

개발 중에는 클래스와 관련되어 있지만 구현 중에는 필요하지 않은 일부 메서드를 정의해야 하는 경우가 많습니다. 예를 들어 환경 변수를 설정하거나 다른 클래스의 변수를 수정하려면 클래스나 인스턴스를 참조하세요. 이때 정적 메소드를 사용할 수 있습니다.

Python은 데코레이터 @staticmethod를 사용하여 정적 메서드를 정의합니다.

IND = 'ON'

class Kls(object):
    def __init__(self, data):
        self.data = data
    @staticmethod
    def checkind():
        return IND == 'ON'
    def do_reset(self):
        if self.checkind():
            print('Reset done for: %s' % self.data)
    def set_db(self):
        if self.checkind():
            print('DB connection made for: %s' % self.data)
ik1 = Kls(24)
ik1.do_reset()
ik1.set_db()
로그인 후 복사

Output:

Reset done for: 24 
DB connection made for: 24
로그인 후 복사

코드에서 전역 변수 IND를 정의합니다. IND는 다음과 관련되어 있기 때문입니다. Kls 관련 클래스이므로 Kls 클래스에 정의된 checkind 메소드를 배치합니다. checkind 메소드는 클래스나 인스턴스를 참조하지 않고 IND 값만 확인하면 되므로 checkind 메소드를 정적 메소드로 정의합니다.

정적 메서드의 경우 Python은 클래스나 인스턴스를 전달할 필요가 없으므로 클래스나 인스턴스를 사용하여 정적 메서드를 호출할 수 있습니다.

인스턴스 메서드, 클래스 메서드 및 정적 메서드의 차이점

코드를 사용하여 인스턴스 메서드, 클래스 메서드 및 정적 메서드의 차이점을 설명합니다. 행동 양식. 다음 코드에서 foo, class_foo 및 static_foo 메서드의 정의와 사용에 주의하세요.

class Kls(object):
    def foo(self, x):
        print('executing foo(%s,%s)' % (self, x))
    @classmethod
    def class_foo(cls,x):
        print('executing class_foo(%s,%s)' % (cls,x))
    @staticmethod
    def static_foo(x):
        print('executing static_foo(%s)' % x)
ik = Kls()
# 实例方法
ik.foo(1)
print(ik.foo)
print('==========================================')
# 类方法
ik.class_foo(1)
Kls.class_foo(1)
print(ik.class_foo)
print('==========================================')
# 静态方法
ik.static_foo(1)
Kls.static_foo('hi')
print(ik.static_foo)
로그인 후 복사

출력:

executing foo(<__main__.Kls object at 0x0551E190>,1)
<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
==========================================
executing class_foo(<class &#39;__main__.Kls&#39;>,1)
executing class_foo(<class &#39;__main__.Kls&#39;>,1)
<bound method type.class_foo of <class &#39;__main__.Kls&#39;>>
==========================================
executing static_foo(1)
executing static_foo(hi)
<function static_foo at 0x055238B0>
로그인 후 복사

인스턴스 메서드의 경우 호출 시 인스턴스 ik가 self 매개변수의 첫 번째 매개변수로 전달됩니다. 따라서 ik.foo(1)을 호출하면 인스턴스 ik의 주소가 인쇄됩니다.

클래스 메소드의 경우 호출 시 클래스 Kls가 첫 번째 매개변수로 cls 매개변수에 전달됩니다. 따라서 ik.class_foo(1) 호출 시 Kls 유형 정보가 출력됩니다.

앞서 언급했듯이 클래스 메소드는 클래스나 인스턴스를 통해 호출될 수 있음을 위 코드에서 다시 한번 확인했습니다.

정적 메서드의 경우 호출 시 클래스나 인스턴스를 전달할 필요가 없습니다. 실제로 정적 메서드는 클래스나 인스턴스를 통해 호출할 수 있다는 점을 제외하면 클래스 외부에서 정의하는 함수와 매우 유사합니다.

위의 예에서 foo는 단지 함수이지만 ik.foo를 호출하면 인스턴스 ik에 바인딩된 함수를 얻게 된다는 점에 주목할 가치가 있습니다. foo를 호출하려면 두 개의 인수가 필요하지만 ik.foo를 호출하려면 하나의 인수만 필요합니다. foo는 ik에 바인딩되어 있으므로 ik.foo를 인쇄하면 다음 출력이 표시됩니다.

<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
로그인 후 복사

ik.class_foo가 호출되면 class_foo는 클래스 메서드이므로 class_foo는 Kls가 바인딩됩니다( ik에 바인딩되는 대신). ik.class_foo를 인쇄하면 출력은 다음과 같습니다.

<bound method type.class_foo of <class &#39;__main__.Kls&#39;>>
로그인 후 복사

ik.static_foo가 호출되면 정적 메서드는 클래스나 인스턴스에 바인딩되지 않으므로 ik.static_foo(또는 Kls.static_foo)를 인쇄합니다. ) 시간 출력 :

<function static_foo at 0x055238B0>
로그인 후 복사

요약하면 클래스에 바인딩할지 인스턴스에 바인딩할지 여부는 인스턴스 메서드, 클래스 메서드, 정적 메서드의 차이입니다.

위 내용은 Python 객체 지향 방법의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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