찾다
백엔드 개발파이썬 튜토리얼객체 지향 Python 코드의 세부 사항 설명

Python은 처음부터 객체지향 언어였기 때문에 Python에서는 클래스와 객체를 쉽게 만들 수 있습니다. 다음 글에서는 Python 객체지향 프로그래밍에 대한 지식 포인트를 자세히 소개합니다. 필요한 친구들이 참고할 수 있습니다.

머리말

객체 지향 프로그래밍 언어를 접해본 적이 없다면 다음 사항을 알아야 할 수도 있습니다. 먼저 객체지향 언어의 일부 기본 기능은 마음속에 기본적인 객체지향 개념을 형성하는데, 이는 Python 객체지향 프로그래밍을 더 쉽게 배우는 데 도움이 될 것입니다.

다음으로 Python의 객체지향 프로그래밍에 대해 알아 보겠습니다.

클래스와 인스턴스

클래스는 객체의 정의이고, 인스턴스는 객체를 저장하는 "실제 객체"입니다. 클래스 객체 특정 정보에 정의되어 있습니다.

클래스, 속성 및 메서드명명 규칙

클래스 이름은 일반적으로 대문자로 시작합니다. 이는 표준 규칙이며 특히 인스턴스화 중에 클래스를 식별하는 데 도움이 될 수 있습니다(때때로 함수 호출처럼 보임). 또한 데이터 속성(변수 또는 상수)은 데이터 값의 이름과 비슷해야 하며, 메서드 이름은 해당 개체나 값의 동작을 나타내야 합니다.

또 다른 표현 방법은 데이터 값은 명사를 이름으로 사용해야 하고, 메소드는 술어(동사 + 목적어)를 사용해야 합니다. 데이터 항목은 작업할 개체이며 메서드는 프로그래머가 개체에 대해 수행하려는 작업을 나타내야 합니다.

정의된 클래스에서 "name", "phone" 및 "email"과 같은 데이터 값과 "updatePhone" 및 "updateEmail"과 같은 동작을 사용하여 이 지침을 대략적으로 따릅니다. 이를 종종 "mixedCase" 또는 "camelCase"라고 합니다. Python 사양에서는 "update_phone", "update_email"과 같이 밑줄이 포함된 카멜 표기법을 사용할 것을 권장합니다. 클래스 이름도 "AddrBookEntry", "RepairShop" 등과 같이 주의 깊게 지정해야 합니다. 좋은 이름입니다.

class AddrBookEntry(object):

 def init(self, name, phone, email):
 self.name = name
 self.phone = phone
 self.email = email

 def update_phone(self, phone):
 self.phone = phone

 def update_email(self. email):
 self.email = email

새 스타일 클래스와 이전 스타일 클래스

새 스타일 클래스와 클래식 클래스 선언의 가장 큰 차이점은 모두 새 스타일 클래스라는 점입니다. -스타일 클래스는 최소한 하나의 상위 클래스를 상속해야 합니다. 상속할 클래스가 없으면 객체 클래스를 상속받을 수 있습니다. 객체는 "모든 클래스의 어머니"이며 모든 클래스 상속 구조의 최상위에 위치합니다. 객체의 직접적 또는 간접적 서브클래싱이 없으면 클래식 클래스가 정의됩니다. 즉, 상위 클래스가 지정되지 않거나 서브클래싱되는 기본 클래스에 상위 클래스가 없는 경우 클래식 클래스가 생성됩니다.

Python3에서 정의된 클래스는 기본적으로 새로운 스타일의 클래스입니다. Python2에서 새로운 스타일의 클래스를 정의하려면 객체를 상속하거나 새로운 스타일의 클래스를 상속받아야 합니다.

자체 변수

클래스의 메소드는 일반 함수와 한 가지 특별한 차이점이 있습니다. 즉, 추가 첫 번째 매개변수가 있어야 합니다. 이름이지만 이 메서드를 호출할 때 이 매개 변수에 값을 할당할 필요는 없습니다. Python이 이 값을 제공합니다. 이 특정 변수는 객체 자체를 참조하며 관례적으로 이름은 self입니다. 이 매개변수에 임의의 이름을 지정할 수 있지만 self라는 이름을 사용하는 것이 강력히 권장되며 다른 이름은 더 이상 사용되지 않습니다.

init() 메소드

init()는 클래스 생성자와 유사하지만 실제로 생성자는 아닙니다. Python은 인스턴스를 생성한 후 인스턴스화 프로세스 중에 init() 메서드를 호출합니다. 클래스가 인스턴스화되면 초기 값을 설정하거나 일부 예비 진단 코드를 실행하는 등의 추가 동작을 정의할 수 있습니다. 인스턴스가 생성된 후 인스턴스화 호출은 특정 작업이나 설정을 수행하기 위해 인스턴스를 반환합니다.

바인딩된 메서드와 바인딩되지 않은 메서드

Python에서 클래스에 액세스하는 메서드는 인스턴스나 클래스를 통해 직접 액세스할 수 있습니다. 그러나 Python에서는 인스턴스 없이 메서드를 호출할 수 없도록 엄격하게 요구합니다. 이 제한 사항은 Python에서 바인딩으로 설명하는 것입니다. 즉, 메서드를 직접 호출하려면 인스턴스에 바인딩해야 합니다. 바인딩되지 않은 메서드를 호출할 수 있지만 호출이 성공하도록 하려면 인스턴스 개체를 명시적으로 제공해야 합니다. 그러나 바인딩 여부에 관계없이 메서드는 거의 항상 인스턴스를 통해 호출되지만 메서드가 발견된 클래스의 고유 속성입니다. Python의 클래스 메서드도 객체입니다. 클래스를 통해 직접 액세스하는 메서드를 "언바운드 메서드"라고 하고, 인스턴스를 통해 액세스하는 메서드를 "바운드 메서드"라고 한다고 간단히 이해하면 됩니다.

1. 언바운드 정의된 클래스 메서드: no self

通过类来引用方法返回一个未绑定方法对象。要调用它,你必须显示地提供一个实例作为第一个参数。

2. 绑定的实例方法:有 self

通过实例访问方法返回一个绑定的方法对象。Python 自动地给方法绑定一个实例,所以我们调用它时不用再传一个实例参数。

示例:

class Test:
 def func(self, message):
 print message

object1 = Test()
x = object1.func
x("绑定方法对象,实例是隐藏的")

t = Test.func
t(object1, "未绑定方法对象,需要传递一个实例")
# t("未绑定方法对象,需要传递一个实例") # 错误的调用

类属性与实例属性

类属性仅是与类相关的数据值,和实例属性不同,类属性和实例无关。这些值像静态成员那样被引用,即使在多次实例化中调用类,它们的值都保持不变。不管如何,静态成员不会因为实例而改变它们的值,除非实例中显式改变它们的值。 实例属性与类属性的比较,类似于自动变量和静态变量,但这只是笼统的类推。在你对自动变量和静态变量还不是很熟的情况下,不要深究这些。

类和实例都是名字空间。类是类属性的名字空间,实例则是实例属性的。

可采用类来访问类属性,如果实例没有同名的属性的话,也可以用实例来访问。

私有化

Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机。

为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可。由双下划线  开始的属性在运行时被“混淆”,所以直接访问是不允许的。

实际上,在 Python 带有双下划线的属性或方法并非正真意义上的私有,它们仍然可以被访问。在类的内部定义中,所有以双下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式:

>>> class TestObj(object):
... war = "world"
... 
... def init(self):
...  self.har = "hello"
...  
... def foo(self):
...  print(self.har + self.war)
...  
... 
... 
>>> t = TestObj()
>>> dir(t)
['_TestObjfoo', '_TestObjhar', '_TestObjwar', 'class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getat
tribute', 'gt', 'hash', 'init', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr
', 'sizeof', 'str', 'subclasshook', 'weakref']
>>> t.war
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.war
AttributeError: &#39;TestObj&#39; object has no attribute &#39;war&#39;
>>> t.har
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.har
AttributeError: &#39;TestObj&#39; object has no attribute &#39;har&#39;
>>> t.foo()
Traceback (most recent call last):
 File "<input>", line 1, in <module>
 t.foo()
AttributeError: &#39;TestObj&#39; object has no attribute &#39;foo&#39;
>>> t._TestObjwar
&#39;world&#39;
>>> t._TestObjhar
&#39;hello&#39;
>>> t._TestObjfoo()
helloworld

slots 类属性

正常情况下,当我们定义了一个 class,创建了一个 class 的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。在 Python 中默认用字典来存储实例的属性。

示例:

>>> class A():
... pass
... 
>>> a = A()
>>> a.name = "huoty"
>>> a.age = 25
>>> print a.name
huoty
>>> print a.age
25
>>> a.dict
{&#39;age&#39;: 25, &#39;name&#39;: &#39;huoty&#39;}

字典位于实例的“心脏” 。 dict属性跟踪所有实例属性。举例来说,你有一个实例 inst,它有一个属性 foo,那使用 inst.foo 来访问它与使用 inst.dict['foo'] 来访问是一致的。

字典会占据大量内存,如果你有一个属性数量很少的类,但有很多实例,那么正好是这种情况。为内存上的考虑,可以使用 slots 属性来替代 dict

slots 是新式类的特性。基本上, slots 是一个类变量,由一序列对象组成,由所有合法标识构成的实例属性的集合来表示。它可以是一个列表,元组或可迭代对象。也可以是标识实例能拥有的唯一的属性的简单字符串。任何试图创建一个其名不在 slots 中的名字的实例属性都将导致 AttributeError 异常:

>>> class SlotedClass(object):
... slots = ("foo", "bar")
... 
... 
>>> c = SlotedClass()
>>> c.foo = 42
>>> c.bar = "hello"
>>> c.goo = "don&#39;t think so"
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: &#39;SlotedClass&#39; object has no attribute &#39;goo&#39;


这种特性的主要目的是节约内存。其副作用是某种类型的"安全",它能防止用户随心所欲的动态增加实例属性。带 slots 属性的类定义不会存在 dict 了(除非你在 slots 中增加 dict 元素)。

总结

【相关推荐】

1. Python免费视频教程

2. python遇见数据采集视频

3. Python学习手册

위 내용은 객체 지향 Python 코드의 세부 사항 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
어레이는 파이썬으로 과학 컴퓨팅에 어떻게 사용됩니까?어레이는 파이썬으로 과학 컴퓨팅에 어떻게 사용됩니까?Apr 25, 2025 am 12:28 AM

Arraysinpython, 특히 비밀 복구를위한 ArecrucialInscientificcomputing.1) theaRearedFornumericalOperations, DataAnalysis 및 MachinELearning.2) Numpy'SimplementationIncensuressuressurations thanpythonlists.3) arraysenablequick

같은 시스템에서 다른 파이썬 버전을 어떻게 처리합니까?같은 시스템에서 다른 파이썬 버전을 어떻게 처리합니까?Apr 25, 2025 am 12:24 AM

Pyenv, Venv 및 Anaconda를 사용하여 다양한 Python 버전을 관리 할 수 ​​있습니다. 1) PYENV를 사용하여 여러 Python 버전을 관리합니다. Pyenv를 설치하고 글로벌 및 로컬 버전을 설정하십시오. 2) VENV를 사용하여 프로젝트 종속성을 분리하기 위해 가상 환경을 만듭니다. 3) Anaconda를 사용하여 데이터 과학 프로젝트에서 Python 버전을 관리하십시오. 4) 시스템 수준의 작업을 위해 시스템 파이썬을 유지하십시오. 이러한 도구와 전략을 통해 다양한 버전의 Python을 효과적으로 관리하여 프로젝트의 원활한 실행을 보장 할 수 있습니다.

표준 파이썬 어레이를 통해 Numpy Array를 사용하면 몇 가지 장점은 무엇입니까?표준 파이썬 어레이를 통해 Numpy Array를 사용하면 몇 가지 장점은 무엇입니까?Apr 25, 2025 am 12:21 AM

Numpyarrayshaveseveraladvantagesstandardpythonarrays : 1) thearemuchfasterduetoc 기반 간증, 2) thearemorememory-refficient, 특히 withlargedatasets 및 3) wepferoptizedformationsformationstaticaloperations, 만들기, 만들기

어레이의 균질 한 특성은 성능에 어떤 영향을 미칩니 까?어레이의 균질 한 특성은 성능에 어떤 영향을 미칩니 까?Apr 25, 2025 am 12:13 AM

어레이의 균질성이 성능에 미치는 영향은 이중입니다. 1) 균질성은 컴파일러가 메모리 액세스를 최적화하고 성능을 향상시킬 수 있습니다. 2) 그러나 유형 다양성을 제한하여 비 효율성으로 이어질 수 있습니다. 요컨대, 올바른 데이터 구조를 선택하는 것이 중요합니다.

실행 파이썬 스크립트를 작성하기위한 모범 사례는 무엇입니까?실행 파이썬 스크립트를 작성하기위한 모범 사례는 무엇입니까?Apr 25, 2025 am 12:11 AM

tocraftexecutablepythonscripts, 다음과 같은 비스트 프랙티스를 따르십시오 : 1) 1) addashebangline (#!/usr/bin/envpython3) tomakethescriptexecutable.2) setpermissionswithchmod xyour_script.py.3) organtionewithlarstringanduseifname == "__"

Numpy 배열은 배열 모듈을 사용하여 생성 된 배열과 어떻게 다릅니 까?Numpy 배열은 배열 모듈을 사용하여 생성 된 배열과 어떻게 다릅니 까?Apr 24, 2025 pm 03:53 PM

numpyarraysarebetterfornumericaloperations 및 multi-dimensionaldata, mumemer-efficientArrays

Numpy Array의 사용은 Python에서 어레이 모듈 어레이를 사용하는 것과 어떻게 비교됩니까?Numpy Array의 사용은 Python에서 어레이 모듈 어레이를 사용하는 것과 어떻게 비교됩니까?Apr 24, 2025 pm 03:49 PM

numpyarraysarebetterforheavynumericalcomputing, whilearraymoduleisiMoresuily-sportainedprojectswithsimpledatatypes.1) numpyarraysofferversatively 및 formanceforgedatasets 및 complexoperations.2) Thearraymoduleisweighit 및 ep

CTYPES 모듈은 파이썬의 어레이와 어떤 관련이 있습니까?CTYPES 모듈은 파이썬의 어레이와 어떤 관련이 있습니까?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingandmanipulatingC-stylearraysinPython.1)UsectypestointerfacewithClibrariesforperformance.2)CreateC-stylearraysfornumericalcomputations.3)PassarraystoCfunctionsforefficientoperations.However,becautiousofmemorymanagement,performanceo

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음