객체 지향 Python에 관한 여섯 가지 질문

王林
풀어 주다: 2023-04-11 20:43:13
앞으로
1091명이 탐색했습니다.

이 글은 Python을 처음 접하는 친구들을 위해 다음 질문을 설명하기 위해 작성되었습니다.

  • 클래스와 객체가 무엇인가요?
  • 함수가 있는데 왜 클래스가 필요한가요?
  • Python은 public을 어떻게 정의하나요? /protected/private attribute/ 메소드? private은 정말 비공개인가요?
  • 클래스 함수, 멤버 함수, 정적 함수를 정의하는 방법과 해당 기능은 무엇인가요?
  • 클래스는 상속될 수 있나요? 하위 클래스를 다시 작성해야 하는 방법은 무엇입니까? 상위 클래스의 함수만 사용할 수 있습니다. 그렇지 않으면 예외가 발생합니까?
  • 다음과 같은 상속 관계가 있습니다: A, B(A), C(A), D( B,C) 그럼 D가 초기화되면 A, B, C는 어떤 순서로 초기화되나요?

1. 클래스와 객체란 무엇인가요?

객체에는 일반적으로 두 가지 의미가 있습니다. .행동할 때나 생각할 때, 구체적으로 상대방을 사랑하는 일이 목표가 되는 것을 말합니다. 프로그래밍의 세계에서 객체는 객관적인 세계에 존재하는 사람, 사물, 객체 등의 개체를 컴퓨터 논리로 매핑한 것입니다.

프로그래밍할 때 객체를 원하는 대로 매핑할 수 있습니다. 그러나 매핑이 더 일반적이면 코드를 사용하고 이해하기가 더 쉽고 이후의 빠른 반복 및 확장에 더 도움이 됩니다. Python의 세계에서는 모든 것이 객체입니다.

클래스에 대해 이야기해 보겠습니다. 클래스는 유사한 항목의 모음을 나타내고 Python 키워드 클래스에 해당하는 분류 클래스입니다.

객체는 클래스 초기화 후 생성되는 클래스의 특정 항목입니다. 일반적으로 객체 또는 엔터티라고도 합니다. 예를 들어 여자는 클래스이고 여자 친구는 객체입니다.

속성: 여자친구의 피부색, 인종, 혈액형 등과 같은 대상의 특정 정적 특성입니다.

기능: 여자친구가 노래하고 피아노를 연주하는 등 개체의 특정 동적 능력.

주어진 예는 적절하지 않을 수 있지만 이해를 깊게 하는 데 도움이 되기를 바랍니다. 실제로 더 정확한 정의는 다음과 같습니다.

클래스는 동일한 속성과 기능을 가진 객체의 모음입니다.

2. 함수가 있는데 왜 클래스가 필요한가요?

함수는 코드 재사용을 해결하기 위한 것이지만, 함수는 절차적 사고이기 때문에 너무 구체적이면 중복이 많이 발생합니다. 구체적이므로 여전히 문제는 추상화되어야 하며 클래스는 일종의 추상화입니다. 추상 클래스는 재사용이 더 쉽고 복잡한 비즈니스 논리에 직면하기 쉬우며 프로그래밍 시 프로그래머의 메모리 압박도 줄여줍니다.

클래스가 없으면 몸 전체에 영향을 미치고 감히 수정하지 못하는 산더미 같은 코드를 작성하기가 더 쉽습니다. 클래스를 사용하면 읽기 쉽고, 유지 관리하기 쉽고, 확장 가능한 코드를 더 쉽게 작성할 수 있습니다.

3. Python은 공개/보호/비공개 속성/메서드를 어떻게 정의합니까? 비공개 여부는 실제로 비공개입니다.

Python은 다음 형식으로 보호/비공개 속성/메서드에 동의합니다.

    __는 비공개를 의미합니다
  • _는 보호를 의미합니다
  • 처음 두 개를 제외하고는 공개입니다
소위 관례는 이중 밑줄 또는 단일 밑줄로 시작하는 변수나 메소드를 볼 때 다음을 수행해야 함을 의미합니다. 의식적으로 클래스 외부에서 수정하거나 액세스하지 마십시오. 즉, Python은 프로그래머가 클래스의 비공개 속성이나 메소드에 액세스하는 것을 방지하지 않습니다.

공용 속성에 액세스하는 것과 보호되는 속성에 액세스하는 것에는 차이가 없습니다.

object._ClassName__PrivateMember
로그인 후 복사

4. 클래스 함수, 멤버 함수 및 정적 함수를 정의하는 방법과 해당 기능은 무엇입니까?

댓글 보기:

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'))
로그인 후 복사

클래스 함수는 @classmethod로 장식됩니다. 첫 번째 매개 변수는 클래스 자체를 나타내는 cls여야 합니다. 즉, 클래스 메서드 함수에서 클래스 생성자 cls()를 호출할 수 있습니다. 새 인스턴스를 생성합니다. 이 시점에서 사용 시나리오를 유추할 수 있습니다.

    생성자를 다시 호출해야 할 때, 즉 새 인스턴스 객체를 생성할 때
  • 기존 인스턴스를 수정하지 않고 새 인스턴스를 반환해야 합니다.
멤버 함수는 매우 일반적이며 개체에서 직접 호출할 수 있는 메서드입니다. 첫 번째 매개 변수는 self여야 합니다.

@staticmethod로 장식된 정적 함수는 일반적으로 이 함수의 계산에 클래스 변수가 포함되지 않으며 클래스의 인스턴스화 없이 사용할 수 있음을 의미합니다. 즉, 함수와 이 클래스 간의 관계가 그다지 가깝지 않습니다. 즉, staticmethod로 장식된 함수는 클래스 외부에서도 정의할 수 있습니다. 나는 때때로 클래스에서 정적 메소드를 사용할지 아니면 utils.py에 별도의 함수를 작성할지 고민합니다.

5. 클래스를 상속할 수 있습니다. 하위 클래스를 사용하려면 먼저 상위 클래스의 함수를 다시 작성해야 합니다. 그렇지 않으면 예외가 발생합니다. 두 번째 방법이 권장됩니다.

첫 번째 유형:

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()
로그인 후 복사

6. 다음과 같은 상속 관계가 있습니다: A, B(A), C(A), D(B,C) 그러면 D가 초기화되면 A, What B와 C의 초기화 순서는 무엇입니까? A가 두 번 초기화됩니까?

---> B---
A--->D
---> C---
로그인 후 복사

A, B, C의 초기화 순서는 무엇입니까?

두 가지 방법이 있습니다. 첫 번째 방법 A는 두 번 초기화되고 두 번째 방법은 초기화되지 않습니다.

첫 번째 유형:

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()
로그인 후 복사

Output;

enter D
enter B
enter C
enter A
levave A
levave C
levave B
levave D
로그인 후 복사

第一种方法非常明确的表明了菱形继承潜在的问题:一个基类的初始化函数可能被调用两次。在一般的工程中,这显然不是我们所希望的。

正确的做法应该是使用 super 来召唤父类的构造函数,而且 python 使用一种叫做方法解析顺序的算法(具体实现算法叫做 C3),来保证一个类只会被初始化一次。

也就是说,能用 super,就用 super。

위 내용은 객체 지향 Python에 관한 여섯 가지 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!