Minuciosamente para conocer los miembros de datos de Python y métodos miembros

En primer lugar, los miembros de datos (atributos)

miembro de datos se puede dividir en dos categorías: los datos pertenecientes a los miembros de datos de objetos y miembro de la clase.

  • La pertenencia a los miembros de datos objeto típicamente __init __ () definido en el método de configuración, por supuesto, también ser definido en otros miembros del proceso, al definir y acceder a los miembros de datos en el ejemplo del método para sí mismo como un prefijo, diferentes objetos de la misma clase (Ejemplo ) simultáneamente y los miembros de datos;
  • La pertenencia a los datos de la clase miembros son compartidas por todos los objetos de esa clase, no pertenecen a ningún objeto, al definir los miembros de datos de esta clase no define ningún miembro del método general.

En segundo lugar, el método miembro

métodos miembro de clase de Python se pueden dividir en métodos públicos, métodos privados, los métodos estáticos, métodos de clase de este tipo.

  • Los métodos públicos, métodos privados se refiere generalmente a un método de instancia pertenece al objeto, el nombre de los métodos particulares en dos guiones "__" comenzó, y método abstracto se define generalmente en una clase abstracta y clase derivada debe volver a implementar los requisitos. Cada objeto tiene sus propios métodos de métodos públicos y privados en estos dos tipos de métodos pueden acceder los miembros pertenecen a clases y objetos.

  • Los métodos públicos invocan a través de nombre de objeto directo "nombre del objeto. Método público (<argumentos>)" método privado no puede llamar directamente el nombre del objeto, sólo se puede llamar por el método de auto prefijo o en otros ejemplos por una especial formas externamente llamar.

  • Todos los ejemplos del método deben tener al menos un llamado auto parámetro y debe ser el primer parámetro de proceso (si hay múltiples palabras de parámetros), el parámetro de auto representa el objeto actual.

  • Necesidad de ser uno mismo prefijo a los miembros de instancia de acceso en un método de instancia, pero externamente por nombre de objeto no tiene que pasar este argumento cuando se llama a los métodos del objeto.

  • Si el exterior a través de los nombres de clase métodos públicos que pertenecen a la invocación de objetos, la necesidad de un método explícito del parámetro auto pasando un nombre de objeto, que se utiliza para especificar explícitamente los miembros para acceder al objeto.

  • Los métodos estáticos y métodos de la clase están disponibles a través del nombre de la clase y el nombre del objeto para llamar, pero no pueden acceder a los miembros que pertenecen al objeto directamente, sólo puede acceder a los miembros de la clase.

  • métodos y métodos estáticos no pertenecen a cualquier instancia de clase, no unido a cualquier instancia, por supuesto, no depende de cualquier estado de la instancia, se puede reducir en comparación con el ejemplo del método de una gran cantidad de gastos generales.

  • El método generalmente abreviado clase cls como métodos de clase de la clase representada por la primera sí mismo parámetro, al llamar al método no requiere los valores de clase para la transmisión de parámetros, métodos estáticos no pueden recibir ningún parámetro.

>>> class Root:
    __total = 0
    def __init__(self, v):    #构造方法
        self.__value = v
        Root.__total += 1

    def show(self):           #普通实例方法
        print('self.__value:', self.__value)
        print('Root.__total:', Root.__total)

    @classmethod              #修饰器,声明类方法
    def classShowTotal(cls):  #类方法
        print(cls.__total)

    @staticmethod             #修饰器,声明静态方法
    def staticShowTotal():    #静态方法
        print(Root.__total)
        
>>> r = Root(3)
>>> r.classShowTotal()              #通过对象来调用类方法
1
>>> r.staticShowTotal()             #通过对象来调用静态方法
1
>>> r.show()
self.__value: 3
Root.__total: 1
>>> rr = Root(5)
>>> Root.classShowTotal()           #通过类名调用类方法
2
>>> Root.staticShowTotal()          #通过类名调用静态方法
2

>>> Root.show()    #试图通过类名直接调用实例方法,失败
TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r)   #但是可以通过这种方法来调用方法并访问实例成员
self.__value: 3
Root.__total: 2
>>> Root.show(rr)  #通过类名调用实例方法时为self参数显式传递对象名
self.__value: 5
Root.__total: 2

En tercer lugar, el atributo del método

  • El uso del método @porperty decorador de la decoración, la función de programa puede "como" acceso a la propiedad, proporcionando así un acceso más fácil de usar.

Atributo de sólo lectura:

>>> class Test:
	    def __init__(self, value):
		self.__value = value

	    @property
	    def value(self):               #只读,无法修改和删除
		return self.__value
>>> t = Test(3)
>>> t.value
3
>>> t.value = 5                        #只读属性不允许修改值
AttributeError: can't set attribute
>>> t.v=5                              #动态增加新成员
>>> t.v
5
>>> del t.v                            #动态删除成员
>>> del t.value                        #试图删除对象属性,失败
AttributeError: can't delete attribute
>>> t.value
3

Legible, la propiedad se puede escribir:

>>> class Test:
    def __init__(self, value):
        self.__value = value	

    def __get(self):
        return self.__value

    def __set(self, v):
        self.__value = v
    value = property(__get, __set)

    def show(self):
        print(self.__value)
>>> t = Test(3)
>>> t.value      #允许读取属性值
3
>>> t.value = 5  #允许修改属性值
>>> t.value
5
>>> t.show()     #属性对应的私有变量也得到了相应的修改
5
>>> del t.value  #试图删除属性,失败
AttributeError: can't delete attribute

Leer, modificar las propiedades de eliminación:

>>> class Test:
    def __init__(self, value):
        self.__value = value

    def __get(self):
        return self.__value

    def __set(self, v):
        self.__value = v

    def __del(self):
        del self.__value

    value = property(__get, __set, __del)

    def show(self):
        print(self.__value)
>>> t = Test(3)
>>> t.show()
3
>>> t.value
3
>>> t.value = 5
>>> t.show()
5
>>> t.value
5
>>> del t.value            #删除属性
>>> t.value                #对应的私有数据成员已删除
AttributeError: 'Test' object has no attribute '_Test__value'
>>> t.show()
AttributeError: 'Test' object has no attribute '_Test__value'
>>> t.value = 1            #为对象动态增加属性和对应的私有数据成员
>>> t.show()
1
>>> t.value
1
Publicados 115 artículos originales · ganado elogios 445 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/zag666/article/details/105209782
Recomendado
Clasificación