truco (dieciséis), método estático, método de clase, método de atributo

Directorio

Uno, método estático

 1.1 Definición

1.2 Características de los métodos estáticos.

1.3 Resumen

Segundo, el método de clase

2.1, definición

2.2, acceso a variables de instancia

2.3. Acceso a variables de clase, es decir, atributos globales / campos estáticos 

Tres, método de atributo

 3.1 Definición

3.2, uso del setter

3.3 uso de deleter

4. Escenarios de aplicación de métodos de atributos.

V. Resumen


Uno, método estático

 1.1 Definición

Delante del método en la clase, puede usar el decorador @staticmethod para cambiar su método decorado a un método estático

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak():
        print('someone is speaking chinese.')
 
# 静态方法在类中也不需要传入 self参数

1.2 Características de los métodos estáticos.

Los métodos estáticos no pueden acceder a variables de instancia y variables de clase

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak(self):
        print('%s is speaking chinese.' % self.name)
 
p = Person('Bigberg')
p.speak()
 
 
# 我们在 speak(self) 函数中传入 self

De hecho, el código anterior se ejecutará incorrectamente, diciendo que speak necesita un autoparámetro, pero no se pasa cuando se llama. Es cierto, cuando speak se convierte en un método estático, no tomará automáticamente la instancia en sí misma como parámetro cuando sea invocada por una instancia. Pasado a uno mismo.  

Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 26, in <module>
    p.speak()
TypeError: speak() missing 1 required positional argument: 'self'

Hay dos formas de hacer que el código anterior se ejecute normalmente:

1. Pase la instancia para hablar () al llamar 

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak(self):
        print('%s is speaking chinese.' % self.name)
 
p = Person('Bigberg')
p.speak(p)
 
# 输出
 
Bigberg is speaking chinese.

2. Elimine self en el método speak, pero esto también significa que no puede llamar a otras variables en la instancia a través de self. 

class Person(object):
 
    def __init__(self, name):
        self.name = name
 
    @staticmethod
    def speak():                # 方法中已经没有 self 参数了
        print('%s is speaking chinese.' % 'anyone')
 
p = Person('Bigberg')
p.speak()
 
 
#输出
anyone is speaking chinese.

1.3 Resumen

Los métodos ordinarios se pueden invocar directamente después de la instanciación, y las variables de instancia o las variables de clase se pueden invocar por sí mismas en el método, pero los métodos estáticos no pueden acceder a las variables de instancia o a las variables de clase, y uno no puede acceder a las variables de instancia y a las variables de clase. El método no tiene nada que ver con la clase en sí, su única relación con la clase es que necesita ser llamado por el nombre de la clase.

Segundo, el método de clase

2.1, definición

Los métodos de clase se implementan a través del decorador @classmethod. La diferencia entre los métodos de clase y los métodos ordinarios es que los métodos de clase solo pueden acceder a las variables de clase, no a las variables de instancia.

2.2, acceso a variables de instancia

El acceso directo a las variables de instancia informará un error, no existe tal atributo 

class Person(object):
 
    def __init__(self, name, country):
        self.name = name
        self.country = country
 
    @classmethod
    def nationality(self):
        print('Bigberg is %s.' % self.country)
 
p = Person('Bigberg', 'CN')
p.nationality()
 
# 输出
Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 31, in <module>
    p.nationality()
  File "G:/python/untitled/study6/静态方法.py", line 24, in nationality
    print('Bigberg is %s.' % self.country)
AttributeError: type object 'Person' has no attribute 'country'
 
# 提示没有一个 country 属性 

2.3. Acceso a variables de clase, es decir, atributos globales / campos estáticos 

class Person(object):
 
    country = 'Chinese'    # 增加一个 全局属性/静态字段
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
 
    @classmethod
    def nationality(cls):    # 这里将sefl 改为 cls
        print('Bigberg is %s.' % cls.country)
 
p = Person('Bigberg', 'CN')
p.nationality()
 
# 输出
Bigberg is Chinese.

Tres, método de atributo

 3.1 Definición

La función del método de propiedad es convertir un método en una propiedad estática a través de @property

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
 
    @property
    def drive(self):
        print('%s is driving a car.' % self.name)


p = Person('Bigberg', 'CN')
p.drive()

# 输出 <br>Traceback (most recent call last): Bigberg is driving a car. File "G:/python/untitled/study6/静态方法.py", line 38, in <module> p.drive() TypeError: 'NoneType' object is not callable
  

La llamada dará un error, indicando que NoneType no es invocable, porque la unidad se ha convertido en una propiedad estática en este momento, no es un método y no necesita agregar el signo () para llamar. Solo p.drive. Llamada normal:

p = Person('Bigberg', 'CN')
p.drive
 
# 输出
 
Bigberg is driving a car.

3.2, uso del setter

Si queremos pasar parámetros en el método de atributo, como la marca del automóvil, usaremos el setter, el nombre de método de uso específico @property name.setter

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
        self.car = "LAMBORGHINI"   # 定义车品牌为兰博基尼
 
    @property
    def drive(self):
        print('%s is driving a %s.' % (self.name, self.car))
 
p = Person('Bigberg', 'CN')
p.drive
 
# 输出
Bigberg is driving a LAMBORGHINI.

 Obviamente, el auto que manejamos era Lamborghini, ¿y si quisiéramos presentarnos a la marca de autos? Por ejemplo, Tesla: 

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
        self.car = "LAMBORGHINI"   #当然这里也可以设置为私有属性
 
    @property
    def drive(self):  # 这里不能传参是因为调用的时候,p.drive 没有()了,不能传入
        print('%s is driving a %s.' % (self.name, self.car))
 
    @drive.setter     # 修饰方法drive,可以为属性赋值
    def drive(self, car):     # 我们要重新定义这个drive方法
        print("set car:", car)
        self.car = car
 
p = Person('Bigberg', 'CN')
p.drive = 'Tesla'     # 给属性赋值
p.drive
 
#输出
 
set car: Tesla
Bigberg is driving a Tesla.

3.3 uso de deleter

Se usa para eliminar métodos de atributos, uso específico @Attribute method name.deleter 

# 以上例
# 我们可以发现普通属性是可以通过del直接删除的
# 比如
print(p.name)
del p.name
print(p.name)
 
# 输出
 
Traceback (most recent call last):
Bigberg
  File "G:/python/untitled/study6/静态方法.py", line 49, in <module>
    print(p.name)
AttributeError: 'Person' object has no attribute 'name'
 
#删除之后就不能再调用了

Pero no podemos usar del p.drive para eliminar el método de atributo:

del p.drive
 
#输出
Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 51, in <module>
    del p.drive
AttributeError: can't delete attribute

Entonces vamos a usar el método de eliminación: 

class Person(object):
 
    country = 'Chinese'
 
    def __init__(self, name, country):
 
        self.name = name
        self.country = country
        self.car = "LAMBORGHINI"
 
    @property
    def drive(self):
        print('%s is driving a %s.' % (self.name, self.car))
 
    @drive.setter
    def drive(self, car):
        print("set car:", car)
        self.car = car
 
    @drive.deleter   # 修饰 drive 方法,可以删除属性
    def drive(self):   # 重新定义 drive方法
        del self.car    #  删除的是属性
        print("扣了你的车,让你开豪车...")
 
p.drive = 'Tesla'
p.drive
 
del p.drive   
 
# 输出
set car: Tesla
Bigberg is driving a Tesla.
扣了你的车,让你开豪车...

Vamos a conducir de nuevo en Qiu Ming Shan ...

p.drive
 
# 输出
扣了你的车,让你开豪车...
Traceback (most recent call last):
  File "G:/python/untitled/study6/静态方法.py", line 57, in <module>
    p.drive
  File "G:/python/untitled/study6/静态方法.py", line 28, in drive
    print('%s is driving a %s.' % (self.name, self.car))
AttributeError: 'Person' object has no attribute 'car'
 
# 提示没有这个属性了

4. Escenarios de aplicación de métodos de atributos.

Desea saber el estado actual de un vuelo, si ha llegado, retrasado, cancelado o ha volado. Para conocer este estado, debe seguir los siguientes pasos:

1. Conecte la consulta API de la aerolínea

2. Analice los resultados de la consulta. 

3. Devuelva los resultados a sus usuarios.

Por lo tanto, el valor del atributo de estado es el resultado obtenido después de una serie de acciones, por lo que cada vez que lo llama, en realidad tiene que pasar por una serie de acciones antes de devolver sus resultados. Solo haz

class Flight(object):
 
    def __init__(self, name):
        self.name = name
 
    def check_status(self):
        print("checking flight %s status" % self.name)
        return 1
 
    @property
    def flight_status(self):
        status = self.check_status()
        if status == 0:
            print("flight got canceled...")
 
        elif status == 1:
            print("flight is arrived...")
 
        elif status == 2:
            print("flight has departured already...")
 
        else:
            print("cannot confirm the flight status")
 
    @flight_status.setter
    def flight_status(self, status):
        status_dic = {
            0: "canceled",
            1: "arrived",
            2: "departured"
        }
        print("\033[31;1mHas changed the flight status to \033[0m", status_dic.get(status))
 
    @flight_status.deleter  # 删除
    def flight_status(self):
        print("status got removed...")
 
f = Flight('CA980')
f.flight_status 
f.flight_status = 2
 
#输出
 
checking flight CA980 status
flight is arrived...
Has changed the flight status to  departured

V. Resumen

  1.  Los métodos estáticos no pueden acceder a variables de instancia o variables de clase
  2. La diferencia entre los métodos de clase y los métodos comunes es que los métodos de clase solo pueden acceder a las variables de clase, no a las variables de instancia
  3. Los métodos de atributo convierten un método en un atributo de una clase, y no necesita agregar () al llamarlo. Hay tres métodos de decoración: @property, @property method name.setter, @property method name.deleter
943 artículos originales publicados · Me gusta 136 · Visita 330,000+

Supongo que te gusta

Origin blog.csdn.net/weixin_36670529/article/details/105220807
Recomendado
Clasificación