>  기사  >  백엔드 개발  >  Python 클래스 및 객체를 사용하는 방법

Python 클래스 및 객체를 사용하는 방법

WBOY
WBOY앞으로
2023-05-13 20:01:141396검색

객체 = 속성 + 메서드

우리는 실제로 캡슐화의 개념을 접한 적이 있습니다. 목록에 지저분한 데이터를 던지는 것은 일종의 캡슐화입니다. 이는 일반적으로 사용되는 코드 세그먼트를 데이터 수준에서 캡슐화하는 것입니다. 함수, 이것도 일종의 캡슐화입니다. 는 명령문 수준의 캡슐화입니다. ; 우리가 지금 배우고 싶은 객체도 캡슐화의 아이디어입니다. 객체의 소스는 두 데이터를 모두 캡슐화하여 실제 세계를 시뮬레이션하는 것입니다. 그리고 함께 코드를 작성합니다.

예를 들어 거북이는 현실 세계의 사물인데, 보통 두 부분으로 나누어 설명합니다.

(1)
정적 특징의 설명: 예를 들어 녹색, 다리가 4개 있음, 껍질이 있음 등입니다. 이는 정적 설명입니다. (2)
동적 행동에 대한 설명: 예를 들어 기어 다니고, 쫓아오면 뛰고, 때로는 물기도 하고, 잠을 자기도 합니다. 이는 모두 행동 측면에서 설명됩니다.

파이썬의 객체도 마찬가지입니다.

객체의 특성을 "속성"이라고 합니다, 객체의 동작을 "메서드"라고 합니다. :

거북이를 코드로 작성하면 다음과 같습니다.

class Turtle: # Python中的类名约定以大写字母开头
    
    # 特征的描述称为属性,在代码层面看来其实就是变量
    color = 'green'
    legs = 4
    shell = True

    # 方法实际就是函数,通过调用这些函数来完成某些工作
    def climb(self):
        print('向前爬')
    def run(self):
        print('向前跑')
    def bite(self):
        print('咬人')
    def sleep(self):
        print('睡觉')

위 코드는 객체

의 특성(속성)과 동작(메서드)을 정의하지만 아직 완전한 객체는 아닙니다. Class라고 정의됩니다. 실제 객체를 생성하려면 클래스를 사용해야 합니다. 이 객체는 이 클래스의 Instance라고 하며 Instance Objects라고도 합니다. 예를 들어, 일련의 장난감을 생산해야 하는 공장과 같습니다. 먼저 장난감의 금형을 만든 다음 금형을 기반으로 대량 생산해야 합니다.
실제 인스턴스 객체를 생성하는 방법은 무엇입니까?

객체 생성(클래스 인스턴스화라고도 함)

은 실제로 매우 간단합니다.

# 首先要有上面那一段类的定义
tt = Turtle()

참고:
클래스 이름 뒤에 괄호가 옵니다. 이는 함수를 호출하는 것과 같습니다. 따라서 Python에서는

클래스 이름이 대문자로 시작하고 함수는 소문자로 시작하므로 구별하기가 더 쉽습니다. 게다가 할당 연산은 필요하지 않지만 생성된 인스턴스 객체를 변수에 할당하지 않으면 이 인스턴스에 대한 참조가 없기 때문에 객체를 사용할 수 없으며 결국 Python의 가비지 수집에 의해 자동으로 재활용됩니다. 기구. 객체에서

메서드를 호출하려면 도트 연산자(.)
를 사용하세요.

Python 클래스 및 객체를 사용하는 방법

다음으로 코드를 살펴보고
class

,

class objectinstance object의 세 가지 개념에 대해 더 깊이 이해해 보겠습니다.

보시다시피 이 예에서 Python 클래스 및 객체를 사용하는 방법가 맞습니다. 인스턴스 객체 c의 count 속성에 값이 할당된 후에는 클래스 객체 C의 count 속성을 덮어쓰는 것과 같습니다. 아래 그림과 같이 할당 적용 ​​범위가 없으면 클래스 개체의 count 속성이 참조됩니다.

클래스에 정의된 속성은 정적 변수

라는 점에 유의해야 합니다. 클래스의 속성은 클래스 객체에 바인딩되며 해당 인스턴스 객체에 의존하지 않습니다.

Python 클래스 및 객체를 사용하는 방법또한

속성 이름이 메서드 이름과 같으면 속성이 메서드를 재정의합니다.

:

이름 충돌을 방지하려면 몇 가지 일반적인 규칙을 따라야 합니다. (1 ) 클래스에서 정의하려고 하지 마십시오. 생각할 수 있는 모든 기능과 메소드는 상속 및 구성 메커니즘을 사용하여 확장되어야 합니다.

(2) 속성 이름에는 명사, 메서드 이름에는 동사, 낙타 표기 사용 등 다양한 품사를 사용하여 이름을 지정합니다.

Python 클래스 및 객체를 사용하는 방법self란 무엇입니까

주의깊은 독자라면 객체의 메소드에 self 매개변수가 있다는 것을 알게 될 것입니다. 그렇다면 이 self는 무엇일까요? C++를 접해 본 적이 있다면 쉽게 알아낼 수 있을 것입니다.
Python의 자체는 실제로 C++의 this 포인터
와 동일합니다.

이전에 어떤 프로그래밍 언어도 접해 본 적이 없다면 간단히 말해서

클래스를 그림과 비교하면

, 클래스에 의해 인스턴스화된 개체는 살 수 있는 실제 집입니다. 수천 채의 집이 하나의 그림을 바탕으로 디자인될 수 있습니다. 모두 비슷해 보이지만 집마다 주인이 다릅니다. 누구나 자신의 집을 찾고 싶어합니다.

여기서 self는 집 번호와 동일합니다

. self를 사용하면 자신의 집을 쉽게 찾을 수 있습니다. Python의 self 매개변수도 같은 이유로 클래스에서 수많은 개체가 생성될 수 있습니다. 개체 메서드가 호출되면 개체는 해당 메서드에 대한 자체 참조를 첫 번째 매개변수로 전달한 다음 Python에서 무엇이 필요한지 알게 됩니다. 객체가 작동되는 방식.

간단한 예:

Python 클래스 및 객체를 사용하는 방법

公有和私有

一般面向对象的编程语言都会区分公有和私有的数据类型,像C++和Java它们使用public和private关键字用于声明数据是公有的还是私有的,但在Python中并没有类似的关键字来修饰。

默认上对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问

Python 클래스 및 객체를 사용하는 방법

为了实现类似私有变量的特征,Python内部采用了一种叫name mangling(名字改编)的技术,在Python中定义私有变量只需要在变量名或函数名前加上“_ _”两个下划线,那么这个函数或变量就会成为私有的了

Python 클래스 및 객체를 사용하는 방법

这样,在外部将变量名“隐藏”起来了,理论上如果要访问,就要从内部进行

Python 클래스 및 객체를 사용하는 방법

但是认真想一下这个技术的名字name mangling(名字改编),那就不难发现其实Python只是把双下横线开头的变量进行了改名而已。实际上,在外部使用“_类名_ _变量名”即可访问双下横线开头的私有变量了

Python 클래스 및 객체를 사용하는 방법

说明:Python目前的私有机制其实是伪私有的,Python的类是没有权限控制的,所有的变量都是可以被外部调用的

继承

举个例子来说明继承。例如现在有个游戏,需要对鱼类进行细分,有金鱼(Goldfish)、鲤鱼(Carp)、三文鱼(Salmon)以及鲨鱼(Shark)。那么我们能不能不要每次都从头到尾去重新定义一个新的鱼类呢?因为我们知道大多数鱼的属性和方法是相似的,如果有一种机制可以让这些相似的东西得以自动传递,那么就方便多了。这就是继承。

继承的语法很简单:

c l a s s 类 名 ( 被 继 承 的 类 ) : . . . class 类名(被继承的类): \\ \quad ... class类名(被继承的类):...

被继承的类称为基类、父类或超类;继承者称为子类,一个子类可以继承它的父类的任何属性和方法。

举个例子:

Python 클래스 및 객체를 사용하는 방법

需要注意的是,如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性

Python 클래스 및 객체를 사용하는 방법

接下来,尝试写一下开头提到的金鱼(Goldfish)、鲤鱼(Carp)、三文鱼(Salmon)以及鲨鱼(Shark)的例子。

import random as r
class Fish:
    def __init__(self):
        self.x = r.randint(0, 10)
        self.y = r.randint(0, 10)
    def move(self):
        # 这里主要演示类的继承机制,就不考虑检查场景边界和移动方向问题
        # 假设所有的鱼都是一路向西游
        self.x -= 1
        print("我的位置是:", self.x, self.y)
# 金鱼
class Goldfish(Fish):
    pass
# 鲤鱼
class Carp(Fish):
    pass
#三文鱼
class Salmon(Fish):
    pass
# 上面三种鱼都是食物,直接继承Fish类的全部属性和方法
# 下面定义鲨鱼类,除了继承Fish类的属性和方法,还要添加一个吃的方法
class Shark(Fish):
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print("吃掉你!")
            self.hungry = False
        else:
            print("太饱了,吃不下了~")

首先运行这段代码,然后进行测试:

Python 클래스 및 객체를 사용하는 방법

同样是继承于Fish类,为什么金鱼(goldfish)可以移动,而鲨鱼(shark)一移动就报错呢?
可以看到报错提示为:Shark对象没有x属性,这是因为在Shark类中,重写了_ _init_ _()方法,但新的_ _init_ _()方法里面没有初始化鲨鱼的x坐标和y坐标,因此调用move()方法就会出错。
那么解决这个问题,只要在鲨鱼类中重写_ _init_ _()方法的时候先调用基类Fish的_ _init_ _()方法

下面介绍两种可以实现的技术:

  • (1)调用未绑定的父类方法

  • (2)使用super函数

调用未绑定的父类方法

什么是调用未绑定的父类方法?举个例子:

Python 클래스 및 객체를 사용하는 방법

修改之后,再运行下发现鲨鱼也可以成功移动了:

Python 클래스 및 객체를 사용하는 방법

这里需要注意的是,这个self并不是父类Fish的实例对象,而是子类Shark的实例对象。所以这里说的未绑定是指并不需要绑定父类的实例对象,使用子类的实例对象代替即可。

super 함수 사용하기

super 함수는 기본 클래스 메서드를 자동으로 찾는 데 도움이 되며 self 매개변수도 전달하므로 다음 작업을 수행할 필요가 없습니다.

Python 클래스 및 객체를 사용하는 방법

실행 후 동일한 결과를 얻습니다.

Python 클래스 및 객체를 사용하는 방법

다중 상속

또한 Python은

다중 상속도 지원합니다. 즉, 여러 상위 클래스의 속성과 메서드를 동시에 상속받을 수 있습니다 :

c l as s 클래스 이름(상위 클래스 1, 상위 클래스 2, 상위 클래스 3, . . . ): . . 쿼드 ... 클래스 클래스 이름(상위 클래스 1, 상위 클래스 2, 상위 클래스 3,...):...

예:

Python 클래스 및 객체를 사용하는 방법

이것은 기본 다중 상속 구문이지만, 다중상속은 코드혼란을 일으키기 쉬우므로 꼭 다중상속을 사용해야 하는지 확신이 서지 않는 경우에는 예상치 못한 BUG가 발생할 수 있으므로 사용을 자제하시기 바랍니다.

Composition

앞서 상속의 개념을 배웠고, 다중 상속에 대해 언급했지만, 이제 거북이와 물고기가 있다면 이제 풀이라는 클래스를 정의해야 하고, 풀에는 거북이와 물고기가 있어야 합니다. . 풀장, 거북이, 물고기는 서로 다른 종이기 때문에 다중 상속을 사용하는 것이 이상해 보입니다. 그렇다면 이들을 풀 클래스로 결합하는 방법은 무엇일까요?

실제로 Python에서는 매우 간단합니다.
필요한 클래스를 넣고 인스턴스화하기만 하면 됩니다. 이를 combination이라고 합니다.

Python 클래스 및 객체를 사용하는 방법

먼저 위의 코드를 실행한 다음 테스트하세요.

Python 클래스 및 객체를 사용하는 방법

생성 및 파괴

Python 객체에는 많은 마법 같은 메소드가 있습니다. 객체가 이러한 메소드 중 하나를 구현하는 경우 특별한 상황에서 이 메소드가 Python에 의해 호출되며 이 모든 작업이 자동으로 발생합니다

.

_ _init_ _(self[, …]) 생성자

_ _init_ _() 메서드는 일반적으로 개체가 인스턴스화되는 한

이 메서드는 개체가 생성될 때 자동으로 호출됩니다. . 객체를 인스턴스화할 때 매개변수가 전달될 수 있습니다. 이러한 매개변수는 _ _init_ _() 메서드에 자동으로 전달되며 이 메서드를 재정의하여 객체의 초기화 작업을 사용자 정의할 수 있습니다. 예:

어떤 독자들은 때때로 _ _init_ _() 메서드가 클래스 정의에 작성되지만 때로는 그렇지 않은 경우도 있습니다. 왜 그렇습니까? 다음 예를 보십시오:

Python 클래스 및 객체를 사용하는 방법

여기서 주목해야 할 것은

_ _init_ _() 메소드의 반환 값이 None이어야 하고 다른 값이 될 수 없다는 것입니다 Python 클래스 및 객체를 사용하는 방법:

그래서

는 일반적으로 초기화가 필요할 때 사용됩니다. _ _init_ _() 메소드Python 클래스 및 객체를 사용하는 방법를 다시 작성하세요. 따라서 이 _ _init_ _() 메서드는 객체를 인스턴스화할 때 호출되는 첫 번째 메서드가 아닙니다.

_ _new_ _(cls[, …]) 메서드 _ _new_ _() 메서드는 객체가 인스턴스화될 때 호출되는 첫 번째 메서드 입니다. 다른 메소드와 달리 첫 번째 매개변수는 self가 아닌 클래스(cls)이며, 다른 매개변수는 _ _init_ _() 메소드에 직접 전달됩니다.

_ _new_ _() 메서드는

인스턴스 개체를 반환

해야 하며, 일반적으로 cls 클래스에 의해 인스턴스화된 개체입니다. 물론 다른 개체도 반환할 수 있습니다.

_ _new_ _() 메서드는 거의 다시 작성되지 않습니다. 일반적으로 Python은 기본 구성표로 실행될 수 있습니다. 하지만 이 메서드를 재정의해야 하는 상황이 발생합니다, 즉 불변 유형을 상속받을 때

그 특성이 특히 중요해집니다.

_ _del_ _(self) 소멸자 메서드 _ _init_ _() 및 _ _new_ _() 메서드가 객체의 생성자라면 Python은 _ _del_ _() 메서드라는 소멸자도 제공합니다. 객체가 소멸되려고 할 때 이 메서드가 호출됩니다. 그러나 del x는 x._ _del_ _()를 자동으로 호출하는 것과 동일하지 않습니다. _ _del_ _() 메서드는 가비지 수집 메커니즘이 이 개체를 재활용할 때 호출됩니다.

예:

Python 클래스 및 객체를 사용하는 방법

바인딩이란 무엇인가요

앞서 바인딩의 개념을 언급했는데 바인딩이 정확히 무엇인가요? Python에서는 메서드를 호출하기 전에 인스턴스가 있어야 한다고 엄격하게 요구합니다. 이 제한은 실제로 소위 Python의 바인딩 개념입니다.

누군가 이것을 시도해 보고 다음과 같이 호출할 수도 있음을 알 수 있습니다.

Python 클래스 및 객체를 사용하는 방법

그러나 여기에는 문제가 있습니다. 즉, 클래스에 의해 인스턴스화되는 개체에 따라 내부 함수를 전혀 호출할 수 없습니다. :

Python 클래스 및 객체를 사용하는 방법

실제로 Python의 바인딩 메커니즘으로 인해 bb 개체가 자동으로 첫 번째 매개 변수로 전달되므로 TypeError가 발생합니다.

또 다른 예를 보세요:

Python 클래스 및 객체를 사용하는 방법

_ _dict_ _속성은 사전에 인스턴스 객체의 속성만 있습니다. 키는 표시되지 않습니다. 속성 이름 , 값은 속성의 해당 데이터 값 을 나타냅니다.

Python 클래스 및 객체를 사용하는 방법

이제 인스턴스 객체 dd에는 두 개의 새로운 속성이 있으며 이 두 속성은 인스턴스 객체에만 속합니다.

Python 클래스 및 객체를 사용하는 방법

왜 그렇습니까? 실제로 이는 전적으로 self 매개변수 때문입니다. 인스턴스 객체 dd가 setXY 메서드를 호출할 때 전달되는 첫 번째 매개변수는 dd이므로 self.x = 4, self.y = 5는 dd x =와 동일합니다. 4, dd.y = 5이므로 인스턴스 객체나 클래스 객체에서도 x와 y를 볼 수 없습니다. 왜냐하면 이 두 속성은 인스턴스 객체 dd에만 속하기 때문입니다. 클래스 인스턴스가 삭제되어도 인스턴스 객체 dd가 여전히 printXY 메서드를 호출할 수 있나요? 대답은 '예'입니다.

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

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제