>  기사  >  백엔드 개발  >  객체 지향 Python 코드의 세부 사항 설명

객체 지향 Python 코드의 세부 사항 설명

Y2J
Y2J원래의
2017-05-10 11:38:501188검색

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으로 문의하세요.