이 글은 Python을 처음 접하는 친구들을 위해 다음 질문을 설명하기 위해 작성되었습니다.
객체에는 일반적으로 두 가지 의미가 있습니다. .행동할 때나 생각할 때, 구체적으로 상대방을 사랑하는 일이 목표가 되는 것을 말합니다. 프로그래밍의 세계에서 객체는 객관적인 세계에 존재하는 사람, 사물, 객체 등의 개체를 컴퓨터 논리로 매핑한 것입니다.
프로그래밍할 때 객체를 원하는 대로 매핑할 수 있습니다. 그러나 매핑이 더 일반적이면 코드를 사용하고 이해하기가 더 쉽고 이후의 빠른 반복 및 확장에 더 도움이 됩니다. Python의 세계에서는 모든 것이 객체입니다.
클래스에 대해 이야기해 보겠습니다. 클래스는 유사한 항목의 모음을 나타내고 Python 키워드 클래스에 해당하는 분류 클래스입니다.
객체는 클래스 초기화 후 생성되는 클래스의 특정 항목입니다. 일반적으로 객체 또는 엔터티라고도 합니다. 예를 들어 여자는 클래스이고 여자 친구는 객체입니다.
속성: 여자친구의 피부색, 인종, 혈액형 등과 같은 대상의 특정 정적 특성입니다.
기능: 여자친구가 노래하고 피아노를 연주하는 등 개체의 특정 동적 능력.
주어진 예는 적절하지 않을 수 있지만 이해를 깊게 하는 데 도움이 되기를 바랍니다. 실제로 더 정확한 정의는 다음과 같습니다.
클래스는 동일한 속성과 기능을 가진 객체의 모음입니다.
함수는 코드 재사용을 해결하기 위한 것이지만, 함수는 절차적 사고이기 때문에 너무 구체적이면 중복이 많이 발생합니다. 구체적이므로 여전히 문제는 추상화되어야 하며 클래스는 일종의 추상화입니다. 추상 클래스는 재사용이 더 쉽고 복잡한 비즈니스 논리에 직면하기 쉬우며 프로그래밍 시 프로그래머의 메모리 압박도 줄여줍니다.
클래스가 없으면 몸 전체에 영향을 미치고 감히 수정하지 못하는 산더미 같은 코드를 작성하기가 더 쉽습니다. 클래스를 사용하면 읽기 쉽고, 유지 관리하기 쉽고, 확장 가능한 코드를 더 쉽게 작성할 수 있습니다.
Python은 다음 형식으로 보호/비공개 속성/메서드에 동의합니다.
object._ClassName__PrivateMember
class Document(): WELCOME_STR = 'Welcome! The context for this book is {}.' def __init__(self, title, author, context): print('__init__函数被调用') self.title = title self.author = author self.__context = context #类函数 @classmethod def create_empty_book(cls, title, author): return cls(title=title, author=author, context='nothing') # 成员函数 def get_context_length(self): return len(self.__context) # 静态函数 @staticmethod def get_welcome(context): return Document.WELCOME_STR.format(context) empty_book = Document.create_empty_book('What Every Man Thinks About Apart from Sex', 'Professor Sheridan Simove') print(empty_book.get_context_length()) print(empty_book.get_welcome('indeed nothing'))
class A: def fun(self): raise Exception("not implement") class B(A): pass b = B() b.fun()
from abc import ABCMeta,abstractmethod class A(metaclass = ABCMeta): @abstractmethod def fun(self): pass class B(A): pass b = B() b.fun()
---> B--- A--->D ---> C---
class A: def __init__(self): print("A is called")class B(A): def __init__(self): print("B is called") A.__init__(self)class C(A): def __init__(self): print("C is called") A.__init__(self)class D(B,C): def __init__(self): print("D is called") B.__init__(self) C.__init__(self) d = D()
D is called B is called A is called C is called A is called
class A: def __init__(self): print("enter A") print("levave A")class B(A): def __init__(self): print("enter B") super().__init__() print("levave B")class C(A): def __init__(self): print("enter C") super().__init__() print("levave C")class D(B,C): def __init__(self): print("enter D") super().__init__() print("levave D") d = D()
enter D enter B enter C enter A levave A levave C levave B levave D
第一种方法非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。
正确的做法应该是使用 super 来召唤父类的构造函数,而且 python 使用一种叫做方法解析顺序的算法(具体实现算法叫做 C3),来保证一个类只会被初始化一次。
也就是说,能用 super,就用 super。
위 내용은 객체 지향 Python에 관한 여섯 가지 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!