Directorio de artículos
Sintaxis avanzada de Python
Método de instancia, método estático, método de clase
Atributo de clase, atributo de instancia
Son diferentes en definición y uso, y la diferencia más esencial son las diferentes ubicaciones almacenadas en la memoria.
- Los atributos de instancia pertenecen a objetos
- El atributo de clase pertenece a la clase
Ejemplo de código:
class Province(object):
# 类属性
country = '中国'
def __init__(self, name):
# 实例属性
self.name = name
# 创建一个实例对象
obj = Province('山东省')
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country
A partir del código anterior, se puede ver que [se debe acceder a los atributos de instancia a través de objetos] [se accede a los atributos de clase a través de clases]. En uso, se puede ver que los atributos de los atributos de instancia y los atributos de clase son diferentes.
El método de almacenamiento en el contenido es similar a la siguiente figura:
Puede verse en la figura anterior:
Solo se almacena una copia de los atributos de clase en la memoria y una copia de los
atributos de instancia se almacena en cada objeto.
Escenarios de aplicación:
Al crear un objeto de instancia a través de una clase, si cada objeto necesita un atributo con el mismo nombre, use el atributo de clase y use una copia.
Método de instancia, método estático y método de clase
Los métodos incluyen: métodos de instancia, métodos estáticos y métodos de clase,Los tres métodos pertenecen a la clase en memoria, la diferencia radica en los diferentes métodos de llamada.
- Método de instancia: llamado por el objeto; al menos un parámetro self; cuando se ejecuta el método de instancia, el objeto que llama al método se asigna automáticamente a self;
- Método de clase: llamado por la clase; al menos un parámetro de cls; cuando se ejecuta el método de clase, la clase que llama al método se asigna automáticamente a cls;
- Método estático: llamado por la clase, sin parámetros predeterminados;
Ejemplo de código:
class Foo(object):
def __init__(self, name):
self.name = name
def ord_func(self):
""" 定义实例方法,至少有一个self参数 """
# print(self.name)
print('实例方法')
@classmethod
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print('类方法')
@staticmethod
def static_func():
""" 定义静态方法 ,无默认参数"""
print('静态方法')
f = Foo("中国")
# 调用实例方法
f.ord_func()
# 调用类方法
Foo.class_func()
# 调用静态方法
Foo.static_func()
Comparado:
- Similitud: para todos los métodos, pertenecen a la clase, por lo que solo se guarda una copia en la memoria
- Diferencias: el llamador del método es diferente y los parámetros que se pasan automáticamente cuando se llama al método son diferentes.