>  기사  >  백엔드 개발  >  Python 클래스 예제에 대한 자세한 설명

Python 클래스 예제에 대한 자세한 설명

小云云
小云云원래의
2018-03-31 14:47:432488검색

클래스는 개발자가 인스턴스를 얻기 위해 인스턴스화할 수 있는 사용자 정의 유형입니다. 인스턴스는 이 유형의 개체를 나타냅니다. Python에서 클래스는 객체이며 개발자는 함수를 호출할 때 클래스를 매개변수로 전달하거나 함수 호출의 결과로 클래스를 반환할 수 있습니다. 모든 객체, 심지어 클래스 객체에도 유형이 있습니다. Python에서는 유형과 클래스도 일급 객체입니다. 클래스 객체의 유형을 클래스의 메타클래스라고도 합니다. 객체의 동작은 주로 해당 클래스의 객체 유형에 따라 결정됩니다. 이는 클래스에도 적용됩니다. 클래스의 동작은 주로 해당 메타클래스에 의해 결정됩니다.

class 문

  class 문은 클래스 객체를 생성하는 데 가장 일반적으로 사용되는 방법입니다. 다음과 같습니다.

class classname(base_classes):
    statement(s)

classname은 식별자입니다. 식별자는 클래스 문이 실행된 후 클래스 개체에 바인딩되는 변수입니다. base_classes는 값이 클래스 객체여야 하는 쉼표로 구분된 표현식 시퀀스입니다. 예:

class C(B1,B2):  #B1和B2都是类
   statement(s)

마지막으로, class 문은 새 클래스의 인스턴스를 직접 생성하지 않지만, 클래스를 생성하기 위해 이 클래스를 호출할 때 모든 인스턴스에 공통적인 속성 집합(예: 클래스 개체 속성)을 정의합니다. 나중에 예를 들어 보겠습니다.

클래스 객체 속성

  일반적으로 클래스 본문의 식별자에 값을 바인딩하여 클래스 객체의 속성(즉, 클래스 속성)을 지정할 수 있습니다. 예:

class C1(object):
    x =  23print C1.x                 #print:23

클래스 객체 C1에는 값 23에 바인딩된 x라는 속성이 포함되어 있습니다. 인스턴스가 생성될 때 모든 클래스 속성은 해당 클래스의 모든 인스턴스에서 암시적으로 공유된다는 점을 알아야 합니다.
 클래스 객체는 특정 클래스 속성을 암시적으로 설정합니다. __name__ 속성은 클래스 이름 식별자 문자열입니다. __bases__ 속성은 클래스의 기본 클래스에 대한 클래스 객체의 튜플입니다. 예:

print C1.__name__, C1.__bases__            #print: C1, (<type>)</type>

클래스 객체에는 클래스의 사전 객체이며 다른 모든 속성을 저장하는 데 사용되는 __dict__ 속성도 포함되어 있습니다. 클래스 객체 C, 객체 x 및 식별자 S(__name__, __bases__ 및 __dict__ 제외)에 대해 C.S는 C.__dict__['S'] = x와 같습니다. 예:

C1.y = 45C1.__dict__['z']= 67print C1.y,C1z                 #print: 45, 67

Instance

클래스의 인스턴스는 개발자가 바인딩하고 참조할 수 있는 모든 이름의 속성을 가진 Python 개체입니다. 클래스의 인스턴스를 생성하려면 객체가 함수인 것처럼 클래스 객체를 호출합니다. 각 호출은 다음 유형의 새 인스턴스를 반환합니다.

anInstance = C1()

개발자는 클래스 개체를 매개변수 C로 사용하여 내장 함수 isinstance(I, C)를 호출할 수 있습니다. 객체 I가 클래스 C 또는 클래스 C의 하위 클래스의 인스턴스이면 인스턴스는 True를 반환하고, 그렇지 않으면 False를 반환합니다.

__init__

클래스가 __init__이라는 메서드를 정의하거나 상속할 때 클래스 객체를 호출하면 새 인스턴스에서 __int__ 메서드가 암시적으로 실행되어 필요한 인스턴스 관련 초기화를 수행합니다. 이 호출에 전달된 매개변수는 self 매개변수를 제외하고 __init__의 매개변수와 일치해야 합니다. 예:

class C6(objec):
    def __init__(self, n);          self.x = n

C6 클래스의 인스턴스를 생성합니다.

anInstance = C6(42)

__init__의 주요 목적은 새로 생성된 인스턴스의 속성을 바인딩하여 생성하는 것입니다. __init__ 메서드는 값을 반환할 수 없습니다. 그렇지 않으면 Python은 TypeError 예외를 발생시킵니다.
모든 인스턴스 z에서 z..__class__는 z가 속한 클래스 객체이고 z..__dict__는 z가 다른 속성을 저장하는 데 사용하는 사전입니다. 예:

print anInstance.__classs__.__name__, anInstance .__dict__              #print: C6, {'x' : 42}

모든 인스턴스 z, 모든 개체 x 및 모든 식별자 S(__classs 및 __dict__ 제외)의 경우 z.S = x는 z.__dict__['S'] = x와 같습니다. 예:

z.y = 45z.__dict__['z'] = 67print z.y, z.z        #print: 45, 67

__new__

 모든 새로운 유형의 객체에는 __new__라는 정적 메서드가 있거나 상속됩니다. 개발자가 C(*args, **kwds) 클래스의 인스턴스를 생성하기 위해 호출하면 Python은 먼저 C.__new__(C,*args, **kwds)를 호출합니다. Python은 __new__의 반환 값 x를 새로 생성된 인스턴스로 사용합니다. 그런 다음 Python은 C.__init__(x,*args, **kwds)를 호출하지만 이 메서드는 x가 C의 인스턴스 또는 C의 하위 클래스인 것으로 확인된 경우에만 호출됩니다. 예를 들어, x = C(23) 문은 다음과 같습니다.

x = C.__new__(C, 23)if isinstance(x, C):    type(x).__init__(x, 23)

object.__new__는 첫 번째 인수로 허용되는 클래스의 초기화되지 않은 새 인스턴스를 만들 수 있습니다. 이 클래스에 __init__ 메서드가 포함되어 있으면 메서드는 다른 매개변수를 무시하지만, 메서드가 첫 번째 매개변수 외에 다른 매개변수를 허용하고 첫 번째 매개변수의 클래스에 __init__ 메서드가 없으면 이 메서드는 예외를 발생시킵니다. 위의 내용은 Singleton 디자인 패턴을 구현하여 아래에 설명되어 있습니다.

class Singleton(object):
    ## @var __Instance
    __Instance = None
    @staticmethod
    def GetInstance():
        if Singleton.__Instance == None:
            Singleton.__Instance = Singleton()        return Singleton.__Instance    def __new__(cls, *args, **kv):    
        print "__new__"    
        if Singleton.__Instance == None:
            Singleton.__Instance = object.__new__( cls )  
            print "Singleton.__Instance:", Singleton.__Instance                  
        return Singleton.__Instance    def __init__(self, x):
        print "__init__"
        print "self:", self
        self.x = x        print x    def PrintX(self):
        print self.x
anInstance = Singleton(23)
anotherInstance = Singleton(32)

실행 결과:

Python 클래스 예제에 대한 자세한 설명

分析:

从上面运行结果我们可以看出,创建一个新实例时,先调用new方法,再调用init方法。单实例通过重写new方法,第二次实例化时,new返回上次的实例,然后该实例再次调用init方法。

  类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象。在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递一个类作为参数,也可以返回一个类作为函数调用的结果。任何对象,即使是一个类对象,都有一个类型。在Python中,类型和类也都是第一类对象。类对象的类型也被称为该类的元类(metaclass)。对象的行为主要是由该类对象的类型确定的。这也适用于类:类的行为也是主要由该类的元类确定的。

class语句

  class语句是创建一个类对象最常用的方法。如下:

class classname(base_classes):
    statement(s)

classname是一个标识符。该标识符是一个在执行完class语句之后被绑定到类对象的变量。base_classes是一个使用逗号分隔的表达式序列,这些表达式的值必须是类对象。例如:

class C(B1,B2):  #B1和B2都是类
   statement(s)

最后,请注意,class语句并不直接创建新类的任何一个实例,而是定义了在以后调用这个类创建实例时,所有实例共有的属性集(即类对象属性)。

类对象属性

   通常可以通过将一个值绑定到类体中的一个标识符上来指定类对象的一个属性(即类属性)。例如:

class C1(object):
    x =  23print C1.x                 #print:23

类对象C1包含一个名为x的属性,该属性被绑定为值23。我们应该知道,在实例被创建时,任何类属性都由该类的所有实例隐式共享。
  类对象会隐式设置某些类属性。属性__name__是类名标识符字符串。属性__bases__是类的基类的类对象的元组。例如:

print C1.__name__, C1.__bases__            #print: C1, (<type>)</type>

类对象还包含一个属性__dict__,这个属性是该类的字典对象,被用来保存所有其他属性。对于任何类对象C、任何对象x,以及任何标识符S(除了__name__、__bases__和__dict__),C.S等于C.__dict__[‘S’]=x。例如:

C1.y = 45C1.__dict__['z']= 67print C1.y,C1z                 #print: 45, 67

实例

  类的实例是一个带有任意名称的属性的Python对象,开发者可以绑定和引用这些属性。要想创建一个类的实例,可以调用类对象,就像该对象是一个函数一样。每个调用都将返回一个类型为该类的新实例:

anInstance = C1()

开发者可以调用内置函数isinstance(I, C),并使用一个类对象作为参数C。如果对象I是类C或类C的任何子类的一个实例,则instance将返回True,否则返回False。

__init__

  当一个类定义或继承了一个名为__init__的方法时,调用该类对象将对新实例隐式执行__int__方法以执行任何需要的与实例相关的初始化。该调用中传递的参数必须对应于__init__的参数,除了参数self。例如:

class C6(objec):
    def __init__(self, n);          self.x = n

创建类C6的一个实例:

anInstance = C6(42)

__init__的主要目的就是绑定,并因此创建新创建的实例的属性。__init__方法不能返回一个值,否则,Python将引发一个TypeError异常。
对于任何实例z,z..__class__是z所属的类对象,而z..__dict__是z用来保存其他属性的字典。例如:

print anInstance.__classs__.__name__, anInstance .__dict__              #print: C6, {'x' : 42}

对于任何实例z,任何对象x和任何标识符S(除了__classs和__dict__),z.S = x等于z.__dict__[‘S’] = x。例如:

z.y = 45z.__dict__['z'] = 67print z.y, z.z        #print: 45, 67

__new__

  每个新型累都有(或者继承了)一个名为__new__的静态方法。当开发者调用C(*args, **kwds)来创建类C的一个实例时,Python将首先调用C.__new__(C,*args, **kwds)。Python使用__new__的返回值x作为新创建的实例。然后,Python将调用C.__init__(x,*args, **kwds),但是只有在x确认是C的一个实例,或者C的任何一个子类时才会调用该方法。例如:语句x = C(23)等同于:

x = C.__new__(C, 23)if isinstance(x, C):    type(x).__init__(x, 23)

object.__new__可以创建其接受为第一个参数的类的一个新的和未初始化的实例。如果这个类包含一个__init__方法,则该方法将忽略其他参数,但是,如果除了第一个参数,该方法还接受了其他参数,并且第一个参数的类不包含__init__方法,则该方法将引发一个异常。下面通过实现Singleton设计模式来演示上面内容。

class Singleton(object):
    ## @var __Instance
    __Instance = None

    @staticmethod
    def GetInstance():
        if Singleton.__Instance == None:
            Singleton.__Instance = Singleton()        return Singleton.__Instance    def __new__(cls, *args, **kv):    
        print "__new__"    
        if Singleton.__Instance == None:
            Singleton.__Instance = object.__new__( cls )  
            print "Singleton.__Instance:", Singleton.__Instance                  
        return Singleton.__Instance    def __init__(self, x):
        print "__init__"
        print "self:", self
        self.x = x        print x    def PrintX(self):
        print self.x

anInstance = Singleton(23)
anotherInstance = Singleton(32)

运行结果:

Python 클래스 예제에 대한 자세한 설명

分析:

从上面运行结果我们可以看出,创建一个新实例时,先调用new方法,再调用init方法。单实例通过重写new方法,第二次实例化时,new返回上次的实例,然后该实例再次调用init方法。

위 내용은 Python 클래스 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.