Contenido de este capítulo: Comprender clases y objetos de una manera sencilla y fácil de entender.
Todos los códigos relevantes se pueden ver en https://github.com/hzyao/Python-Cookbook .
¡Es maravilloso aprender y practicar al mismo tiempo y descubrir con el tiempo! ¡Puede que sepa mejor si se comen juntos!
clases y objetos
En la vida, podemos organizar datos diseñando formularios, produciendo formularios y completándolos. ¡Venir! ¡ Comparemos con las clases del programa !
- Formulario de diseño - clase de diseño (clase)
- Imprimir formulario - crear objeto
- Complete el formulario - asignación de atributos de objeto
Es decir, podemos usar clases para encapsular atributos y crear objetos uno por uno según la clase a usar.
1 Clases y Objetos
Sintaxis de uso de clase:
class 类名称:
类的属性
类的行为
对象 = 类名称()
"""
1. class是关键字,表示要定义类啦
2. 类的属性,即定义在类中的变量(成员变量)
3. 类的行为,即定义在类中的函数(成员方法)
"""
¿Cuál es exactamente el comportamiento (método) de una clase?
class Student:
name = None
age = None
def say_hi(self):
print(f"嗨大家好!我是{
self.name}")
Student.name = "run"
Student.age = 18
print(Student.name)
print(Student.age)
De lo anterior podemos ver que no solo se pueden definir propiedades en una clase para registrar datos, sino que también se pueden definir funciones para registrar comportamiento. en:
- Atributos (variables) definidos en una clase, los llamamos: variables miembro
- El comportamiento (función) definido en la clase, lo llamamos: método miembro
¡De ahora en adelante, llamaremos a las funciones definidas dentro de los métodos de la clase !
Sintaxis de definición del método miembro:
Definir métodos miembro en una clase es básicamente lo mismo que definir funciones, pero aún existen diferencias sutiles:
def 方法名(self, 形参1, ......, 形参N):
方法体
En la lista de parámetros de la definición del método, hay una self
palabra clave que debe completarseself
cuando se define el método miembro . Se utiliza para representar el significado del objeto de clase en sí . Cuando usamos el objeto de clase para llamar a un método, Python lo pasará automáticamente. Dentro del método, si deseas acceder a las variables miembro de la clase, debes utilizar .self
self
Nota: self
Aunque la palabra clave aparece en la lista de parámetros, no ocupa la posición del parámetro y puede ignorarse al pasar parámetros.
class Student:
name = None
def say_hi(self):
print(f"Hello 大家好 我是{
self.name}")
def say_hi2(self, msg):
print(f"Hello 大家好 我是{
self.name} {
msg}")
stu1 = Student()
stu1.name = "run"
stu1.say_hi() # 调用的时候无需传参
stu1.say_hi2("很高兴认识大家!") # 调用的时候,需要传msg参数
stu2 = Student()
stu2.name = "xmy"
stu2.say_hi()
stu2.say_hi2("嘿嘿嘿!")
Al pasar parámetros, self
se puede decir que es transparente, ¡ignórelo! ¡ Los parámetros msg
varían!
Por lo tanto, la sintaxis de definición de métodos de clase y miembro es la siguiente:
class 类名称:
成员变量
def 成员方法(self, 参数列表):
成员方法体
对象 = 类名称()
Hemos aprendido que la sintaxis para crear objetos basados en clases es 对象 = 类名称()
.
Entonces, ¿por qué tenemos que crear un objeto antes de poder usarlo?
Una clase es simplemente un "dibujo de diseño" dentro de un programa, y las entidades (es decir, objetos) deben generarse en función del dibujo para que funcione correctamente. Esta rutina es lo que llamamos " programación orientada a objetos ": diseñar clases, crear objetos basados en clases y usar objetos para completar un trabajo específico .
# 练习:设计一个闹钟类
class Clock:
id = None # 序列号
price = None # 价格
def ring(self):
print("beep")
clock1 = Clock()
clock1.id = "1220"
clock1.price = 9.99
print(f"id is {
clock1.id}, price is {
clock1.price}")
clock1.ring()
clock2 = Clock()
clock2.id = "0324"
clock2.price = 8.88
print(f"id is {
clock2.id}, price is {
clock2.price}")
clock2.ring()
2 Utilice el constructor para asignar valores a variables miembro
En el estudio anterior, asignamos valores a las propiedades de los objetos en orden, lo cual fue un poco engorroso. En realidad, ¡podemos hacer esto de una manera más eficiente! ¡Asigne valores a propiedades como parámetros de función!
Las clases de Python pueden usar **__init__()**
métodos, llamados constructores .
- Se ejecutará automáticamente al crear un objeto de clase (construir una clase) .
- Al crear un objeto de clase (construir una clase), los parámetros entrantes se pasan automáticamente al método __init__ para su uso .
# 构造方法的名称:__init__
class Student:
name = None
age = None
tel = None # 这些可以省略
def __init__(self, name, age, tel):
self.name = name
self.age = age
self.tel = tel
print("done")
stu = Student("run", 18, "0324")
print(stu.name)
print(stu.age)
print(stu.tel)
Nota: El constructor también es un método miembro, no olvide proporcionarlo en la lista de parámetros self
; y al definir variables miembro dentro del constructor, debe usar palabras clave self
.
# 练习:学生信息录入
class Student:
def __init__(self):
self.name = input("请输入学生姓名:")
self.age = int(input("请输入学生年龄:"))
self.address = input("请输入学生地址:")
for i in range(1, 11):
print(f"当前录入第{
i}位学习信息,总共需录入10位学习信息")
stu = Student()
print(f"学生{
i}信息录入完成,信息为:【学生姓名:{
stu.name}, 年龄:{
stu.age}, 地址:{
stu.address}】")
3 Otros métodos de clase integrados
Dado que cada uno de estos métodos de clase integrados tiene sus propias funciones especiales, los llamamos métodos mágicos .
Hay muchos métodos mágicos, ¡comprendamos primero los más comunes! Por ejemplo: __init__
(método de construcción), __str__
(método de cadena), __lt__
(comparación de símbolo mayor que, menor que), __le__
(comparación de símbolo mayor o igual, menor o igual que), __eq__
(== comparación de símbolo), etc.
3.1 str : método de cadena
Función: Controla el comportamiento de convertir clases en cadenas.
- Nombre del método:
__str__
- Valor de retorno: cadena
- Contenido: Personalízalo tú mismo
# __str__ 字符串方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
stu = Student("run", 18)
print(stu)
print(str(stu)) # 会输出内存地址
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"name:{
self.name}, age:{
self.age}"
stu = Student("run", 18)
print(stu)
print(str(stu))
3,2 lt : <, > comparación de símbolos
Función: No es posible comparar dos objetos directamente, pero al implementar __lt__
el método en la clase, se pueden completar las dos comparaciones al mismo tiempo: el símbolo mayor que y el símbolo menor que.
- Nombre del método:
__lt__
- Pasar parámetros:
other
, otro objeto de clase - Valor de retorno:
True
oFalse
- Contenido: Personalízalo tú mismo
# __lt__ 方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
stu1 = Student("run", 18)
stu2 = Student("xmy", 16)
print(stu1 < stu2) # False
print(stu1 > stu2) # True
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
stu1 = Student("run", 18)
stu2 = Student("xmy", 16)
print(stu1 < stu2) # 无法比较会报错
3.3 archivo : <=, >= comparación de símbolos
Función: Se puede utilizar para dos operadores de comparación <= y >=.
- Nombre del método:
__le__
- Parámetros entrantes: otro, otro objeto de clase
- Valor de retorno:
True
oFalse
- Contenido: Personalízalo tú mismo
# __le__ 方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
return self.age <= other.age
stu1 = Student("run", 18)
stu2 = Student("xmy", 16)
print(stu1 <= stu2) # False
print(stu1 >= stu2) # True
3.4 eq : == comparación de símbolos
Función: Se puede utilizar en el operador de comparación ==.
- Nombre del método:
__eq__
- Parámetros entrantes: otro, otro objeto de clase
- Valor de retorno:
True
oFalse
- Contenido: Personalízalo tú mismo
# __eq__ 方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
stu1 = Student("run", 18)
stu2 = Student("xmy", 18)
print(stu1 == stu2) # False
Resumir:
__init__
: Método constructor, que se puede utilizar para establecer el comportamiento de inicialización al crear objetos de clase;
__str__
: Se utiliza para implementar el comportamiento de convertir objetos de clase en cadenas;
__lt__
: Se utiliza para comparar dos objetos de clase por menor o mayor que;
__le__
: Se utiliza para comparar dos objetos de clase por menor o igual o mayor o igual que;
__eq__
: Se utiliza para comparar la igualdad de dos objetos de clase.