Orientado a objetos basado en python - Parte 2

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.

profundidad primero y ancho primero
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:
inserte la descripción de la imagen aquí
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

Acho que você gosta

Origin blog.csdn.net/JaysonWong/article/details/105856085
Recomendado
Clasificación