Directorio
1.2 Características de los métodos estáticos.
2.2, acceso a variables de instancia
2.3. Acceso a variables de clase, es decir, atributos globales / campos estáticos
4. Escenarios de aplicación de métodos de atributos.
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
- Los métodos estáticos no pueden acceder a variables de instancia o variables de clase
- 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
- 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