Consulte el artículo anterior en el artículo anterior , presentamos principalmente las ideas y conceptos básicos de la orientación a objetos y cómo vincular propiedades y métodos a clases e instancias. Este artículo presenta principalmente decoradores de clase, herencia, métodos estáticos, métodos de clase, etc.
1. Decorador de clase
El decorador de python es una función que se usa a menudo en el desarrollo de programas. Para entender el decorador, primero debe tener claro:
1. La función decorador se ejecuta inmediatamente cuando se importa el módulo, y la función decorada solo se ejecuta cuando se la llama explícitamente.
2. En python, una función es una variable especial, es decir, una función también se puede pasar como parámetro a otras funciones.
Si no conoce los decoradores, puede consultarlos aquí Haga clic aquí para ver los decoradores.
# -*- coding:utf-8 -*-
class Hello:
def info(self, func):
func()
s = Hello()
@s.info
def f():
print("hello world!")
producción:
hello world!
Como arriba: el decorador se ejecuta inmediatamente cuando se importa, y f() se pasará como parámetro al parámetro func en info.
Decorador complejo:
# -*- coding:utf-8 -*-
import time
class Hello:
def info(self, f):
print("f:", f)
def second_func(func):
def thired_func(*args):
if f == "1":
new_time = time.strftime("%y-%m-%d", time.localtime())
elif f == "0":
new_time = time.strftime("%y-%m-%d", time.localtime())
print(func.__name__, *args, new_time)
return thired_func
return second_func
s = Hello()
@s.info("1")
def f(a, b):
print("hello world!")
f(1,2)
producción:
f: 1
f 1 2 20-04-30
De manera similar, en @s.info("1"), 1 se pasa primero a info como parámetro de info, luego f se pasa a second_func como parámetro y finalmente (1, 2) se pasa a third_func como parámetro, capa por capa.
dos, decorador de propiedades
El decorador de propiedades puede disfrazar el método de la clase como el método para llamar a la propiedad de la clase. Esto es muy útil en muchos casos y puede ayudarlo a escribir código conciso y hermoso.
# -*- coding:utf-8 -*-
class Stu(object):
__name = "male"
__age = 0
@property
def age(self):
return self.__age
@age.setter
def age(self,v):
if not isinstance(v,int):
raise ValueError("值错误")
if v > 130 or v < 0:
raise ValueError("值错误")
self.__age = v
@age.deleter
def age(self):
print("删除用户数据")
m = Stu()
m.age = 100
print(m.age)
del m.age
producción:
100
删除用户数据
Agregue el decorador @property sobre la base de métodos ordinarios, como el método age() anterior. Esto es equivalente a un método get, que se usa para obtener el valor y decidir qué código ejecutar como "result = obj.age". Este método tiene solo un parámetro propio. Escriba un método con el mismo nombre y agregue el decorador @xxx.setter (xxx significa el mismo nombre que el método anterior), como el segundo método del ejemplo. Esto es equivalente a escribir un método set para proporcionar una función de asignación para determinar qué código ejecutar para una declaración como "obj.age = ...". Escriba otro método con el mismo nombre y agregue el decorador @xxx.delete, como el tercer método del ejemplo. Se utiliza para eliminar la función, que determina qué código se ejecuta mediante una declaración como "del obj.age".
3. Herencia
Herencia: Es decir, una clase derivada (clase derivada) hereda los campos y métodos de la clase base (clase base).
Si una clase está definida y hereda una clase existente, la nueva clase se denomina subclase y la clase heredada se denomina clase base, clase principal o superclase (clase base, superclase). Beneficios de la herencia: reutilización de código La herencia se divide en herencia única y herencia
múltiple
3.1 Herencia única
La herencia única se refiere a heredar solo una clase principal, como:
# -*- coding:utf-8 -*-
# 类定义
class People:
# 定义基本属性
name = ""
age = 0
__weight = 0
# 构造方法
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说:我目前年龄 %d 正在学PY" %(self.name, self.age))
# 单继承
class Stu(People):
grade = ""
def __init__(self, n, a, w, g):
People.__init__(self, n, a, w)
self.grade = g
# 重写父类的方法
def speak(self):
print("%s说:我目前年龄%d正当学PY,我目前是%s年级" % (self.name, self.age, self.grade))
p1 = Stu("lyy", 15, 120, "2")
p1.speak()
p2 = People("md", 45, 75)
p2.speak()
producción:
lyy说:我目前年龄15正当学PY,我目前是2年级
md 说:我目前年龄 45 正在学PY
La subclase Syu hereda los métodos de la clase principal People.
3.2 Herencia múltiple
La herencia múltiple se refiere a la herencia de varias clases principales. En el caso de la herencia múltiple, uno de los problemas que deben mencionarse es el orden de la herencia. Antes de determinar el orden de la herencia, debemos comprender dos conceptos: primero en profundidad y primero en amplitud.
En la versión py2.x, las clases clásicas se procesan en orden de profundidad primero,
y las clases de estilo nuevo se procesan en orden de amplitud primero; en el py3.
class BaseClass(object):
def show(self):
print('BaseClass')
class SubClassA(BaseClass):
def show(self):
print('Enter SubClassA')
super().show()
print('Exit SubClassA')
class SubClassB(BaseClass):
def show(self):
print('Enter SubClassB')
super().show()
print('Exit SubClassB')
class SubClassC(SubClassA):
def show(self):
print('Enter SubClassC')
super().show()
print('Exit SubClassC')
class SubClassD(SubClassB, SubClassC):
def show(self):
print('Enter SubClassD')
super().show()
print('Exit SubClassD')
d = SubClassD()
d.show()
La relación de herencia es como se muestra en la siguiente figura:
salida:
Enter SubClassD
Enter SubClassB
Enter SubClassC
Enter SubClassA
BaseClass
Exit SubClassA
Exit SubClassC
Exit SubClassB
Exit SubClassD
[<class '__main__.SubClassD'>, <class '__main__.SubClassB'>, <class '__main__.SubClassC'>, <class '__main__.SubClassA'>, <class '__main__.BaseClass'>, <class 'object'>]
El orden es DBCA-BaseClass.Cuando
se cambia el orden de herencia de SubClassD, por ejemplo: el orden de acceso se convierte en salida class SubClassD(SubClassC, SubClassB):
DCAB-BaseClass :
Enter SubClassD
Enter SubClassC
Enter SubClassA
Enter SubClassB
BaseClass
Exit SubClassB
Exit SubClassA
Exit SubClassC
Exit SubClassD
[<class '__main__.SubClassD'>, <class '__main__.SubClassC'>, <class '__main__.SubClassA'>, <class '__main__.SubClassB'>, <class '__main__.BaseClass'>, <class 'object'>]
4. Método estático
Método estático: un método sin parámetro propio decorado con @staticmethod se denomina método estático. El método estático de una clase no puede tener parámetros y se puede llamar directamente usando el nombre de la clase.
Nota
1. Los métodos estáticos no pueden llamar a variables de instancia.
2. No es necesario pasar una clase o instancia al llamar. Como las funciones que definimos fuera de la clase, excepto que el método estático se puede llamar a través de la clase o instancia.
class Eat:
name = "jsonwong"
age = 18
@staticmethod
def func():
print('hello world!')
eat = Eat()
eat.func()
producción:
hello world!
Cinco, método de clase
Los métodos de clase se implementan con el decorador @classmethod.
Nota
1. Los métodos de clase solo pueden acceder a variables de clase, no a variables de instancia.
2. Pase el objeto de clase actual a través del parámetro cls, sin instanciación, y acceda directamente a él a través del objeto de clase [nombre de instancia. nombre de método] y la instancia de objeto de clase [nombre de clase. nombre de método].
class Eat:
name = "jsonwong"
food = "牛肉"
def __init__(self, food):
self.food = food
@classmethod
def func(cls):
print('hello world!', cls.food)
eat = Eat("羊肉")
eat.func()
producción:
hello world! 牛肉
Tenga en cuenta que puede ver arriba que los métodos de clase solo pueden acceder a las variables de clase, no a las variables de instancia.
6. Métodos propietarios de clases
Nombre de método propietario | explicar |
---|---|
_ inicio _ | Método de construcción, utilizado al generar objetos. |
_del_ | Función de análisis, utilizada al soltar el objeto. |
_ dictar _ | Diccionario, información de atributo de clase de registro |
_len_ _ _ | obtener longitud |
_ mro _ | consulta de método |
_ calle _ | mostrar a los usuarios |
_ repr _ | mostrar al analizador |