De la entrada a la prisión orientada a objetos (2)


class Student:
    def __init__(self, name, tel, study_id='001', score=0):
        self.name = name
        self.tel = tel
        self.study_id = study_id
        self.score = score

    # 在打印一个对象的时候,系统会自动用这个对象去调用__repr__方法,并且获取这个方法的返回值
    # 返回值是什么就打印什么(返回值必须是字符串)
    def __repr__(self):
        return f'<{str(self.__dict__)[1:-1]}>'


#   __dict__将对象转换成字典
stu1 = Student('小王', 123456, '0001', 1)
stu2 = Student('小林', 22222, '0002', 12)
print(stu1)  # <'name': '小王', 'tel': 123456, 'study_id': '0001', 'score': 1>

# 对象属性的增删改查
# 查---获取对象的属性值
'''
对象.属性
getattr(对象,属性名) 可以做到动态获取属性值
'''
print(stu1.name)  # 小王

# value=input('请输入要获取的属性名:')
# print(getattr(stu2,value)) # value="name"  小林  value="tel" 22222
print(getattr(stu2, 'height', 180))  # 180 获取不存在的属性如果不给默认值会报错,

# 增/改
'''
对象.属性=值  属性存在的时候就是修改,属性不存在的时候就是增加
setattr(对象,属性名,值) 可以做到动态增加/修改属性值
'''
stu1.name = '我不是小王'
stu1.height = '新添加的属性:身高170'
print(stu1)  # <'name': '我不是小王', 'tel': 123456, 'study_id': '0001', 'score': 1, 'height': '新添加的属性:身高170'>
setattr(stu1, 'name', '我还是小王')
print(stu1)  # <'name': '我还是小王', 'tel': 123456, 'study_id': '0001', 'score': 1, 'height': '新添加的属性:身高170'>

# 删
'''
del 对象.属性   删除属性
del 对象       删除对象

delattr(对象,属性名)
'''
del stu1.height
print(stu1)  # <'name': '我还是小王', 'tel': 123456, 'study_id': '0001', 'score': 1>
delattr(stu1, 'study_id')
print(stu1)  # <'name': '我还是小王', 'tel': 123456, 'score': 1>

Método de objeto:

Definición: Definición directa
Llamada: Objeto. Nombre del método ()
Características: Hay un parámetro predeterminado self, este parámetro no necesita pasarse al llamar, el sistema pasará automáticamente el objeto actual a self para su
uso: Si la función de la función requiere un objeto , Entonces esta función se define como un método de objeto

Método de clase:

Definición: agregue @classmethod antes de definir la función
. Llame: class.method name ()
Características: Hay un parámetro predeterminado cls, este parámetro no necesita pasarse al llamar, el sistema pasará automáticamente la clase actual a cls para su
uso: si la función está implementada La función no requiere que el objeto use la clase, entonces la función se define como un método de clase

Método estático

Definición: Agregue @staticmethod antes de definir la función
. Llame: Clase. Nombre del método ()
Características: Sin parámetros predeterminados.
Uso: Defina métodos estáticos sin necesidad de objetos o clases para realizar la función

class Student:
    # func1是对象方法
    def func1(self):
        print('对象方法')

    # func2是类方法
    @classmethod
    def func2(cls):
        print('cls:', cls)  # cls:<class '__main__.Student'>

    # 当前类能做的,cls都可以做

    # func3是静态方法
    @staticmethod
    def func3():
        print('静态方法')


print('Student:', Student)  # Student: <class '__main__.Student'>
class Person:
    """
    人类
    """
    num = 61

    def __init__(self, name='张三', age=18, gender='男'):
        self.name = name
        self.age = age
        self.gender = gender

    def eat(self, food='面条'):
        print(f'{self.name}在吃{food}')

    @classmethod
    def message(cls):
        print(f'人类目前的数量是:{cls.num}')

    @staticmethod
    def destroy():
        print('人类破坏环境')


p1 = Person()
# 类属性
'''
类名.__doc__    获取类的说明文档
print(Person.__doc__)    # 人类

类名.__module__  获取指定类所在的模块 如果结果是__main__  说明是当前模块
print(Person.__module__)  # __main__
print(list.__module__)  # builtins

对象.__class__   获取指定对象对应的类型,和type(对象)功能一样
print(p1.__class__)  # <class '__main__.Person'>
print(type(p1))  # <class '__main__.Person'>

类名.__name__    获取类名类型为str
print(Person.__name__) # 'Person'
print(int.__name__) # 'int'

类名.__dict__   获取类所有的字段和字段值,转化为字典,key是字段名,value是字段的值
print(Person.__dict__)
对象.__dict__   获取对象所有的属性和属性值,转化为字典,key是属性名,value是属性的值
print(p1.__dict__)  # {'name': '张三', 'age': 18, 'gender': '男'}

类名.__base__  获取指定类的父类
类名.__bases__ 获取类所有的父类
object是python中所有类的基类
print(Person.__base__)   # <class 'object'>
print(Person.__bases__)  # (<class 'object'>,)


'''

# 根据数据不同的类型创建以该类型名命名的文件
datas = ['abc', -0.1234, '你好', 564]
for data in datas:
    with open(rf'files\{data.__class__.__name__}.txt', 'a', encoding='utf-8') as f:
        f.write(str(data) + '\n')

adquiridor

Uso: antes de obtener la propiedad del objeto, si desea hacer otra cosa, puede agregar un getter a esta propiedad.
Uso:
agregue _ antes del nombre de la propiedad que necesita agregar un getter y
defina una función después del decorador @property, el nombre de la función es el nombre de la propiedad eliminado _
La función no tiene parámetros, pero necesita un valor de retorno. El valor de retorno es el resultado de
obtener el valor del atributo. Al obtener el atributo a través del objeto, el atributo no necesita llevar _

class Circle:
    pi = 3.14

    def __init__(self, r=10):
        self.r = r

    @property
    def area(self):
        return Circle.pi * self.r ** 2


c1 = Circle(100)
print(c1.area)

Practique, agregue atributos a Persona, requisito: el valor de edad se guarda en edad, pero al obtener el atributo de edad, lo que
obtiene es: niños (0-4), adolescentes (5-12), jóvenes (13-28), mediana edad (29-) 40) De mediana edad (41-55), ancianos (mayores de 55)

class Person:
    def __init__(self, age=0, name='张三', gender='男'):
        self.name = name
        self._age = age
        self.gender = gender

    @property
    def age(self):
        if 0 <= self._age <= 4:
            return '儿童'
        elif 5 <= self._age <= 12:
            return '少年'
        elif 13 <= self._age <= 28:
            return '青年'
        elif 29 <= self._age <= 40:
            return '中年'
        else:
            return '老年'

setter: debe agregarse antes de agregar getter
'
para hacer algo más en las propiedades del objeto antes de la asignación, otorgue esta propiedad para agregar setter
use
para definir una función detrás del decorador @ nombre de función .setter, el nombre de la función es el nombre de la propiedad para eliminar _
función y solo Un parámetro (este parámetro apunta al valor asignado durante la asignación)

 @age.setter
 def age(self, value):
     print(value)
     if type(value) != int:
         raise ValueError
     if value < 0 or value > 150:
         raise ValueError


p1 = Person()

# p1.age='dwa'  ValueError
# p1.age=151    ValueError

permiso de acceso

Público: las propiedades y métodos públicos se pueden usar dentro y fuera de la clase, y se pueden heredar.
Protegido: las propiedades y métodos protegidos se pueden usar dentro de la clase, pero no se pueden usar afuera, pero los
privados se pueden heredar : propiedades y métodos privados . Los métodos se pueden usar dentro de la clase, no se pueden usar fuera y no se pueden heredar

Los atributos y métodos en
Python solo tienen derechos de acceso: la llamada privatización de Python público es solo una solicitud de explicación

El método de privatización:
agregue __ delante del nombre del atributo y el nombre del método (solo puede comenzar con dos __, no terminar con __)

class Person:
    num = 100
    __info = '动物'

    def __init__(self, name='张三', age=18, gender='男'):
        self.name = name
        self.age = age
        self.gender = gender

    def func1(self):
        return Person.__info

    def __func2(self):
        return Person.num


p1 = Person()
print(p1.func1())  # 动物
print(Person.num)  # 100
# print(Person.__info) # AttributeError: type object 'Person' has no attribute '__info'
# print(p1.func2()) # AttributeError: 'Person' object has no attribute 'func2'
# print(Person._Person__info) # 动物 强行查看

Operador

Cuando Python usa operadores, la esencia es llamar al método correspondiente al
operador. El nombre del método del método correspondiente a cada operador es fijo. Diferentes tipos de datos
llamarán a los métodos correspondientes en diferentes clases al participar en la misma operación.

Si un determinado tipo de datos admite una determinada operación depende de si existe un método correspondiente a este operador en el tipo correspondiente a los datos

# __add__
class Person:
    def __init__(self, age=0, name='?', gender='男'):
        self.name = name
        self._age = age
        self.gender = gender
    #self指向+前面的数据,other指向+后面的数据
    def __add__(self, other):
        return self.name + other.name

    def __mul__(self, other):
        return [self.name for _ in range(len(other.name))]

    def __repr__(self):
        return f'<{str(self.__dict__)[1:-1]}>'

    def __gt__(self, other1):
        return self._age>other1._age

p1 = Person(56,'王五','男')
p2 = Person(1, "小花",'女')
print(p1 + p2)  # 张三李四 本质是:pi.__add__(p2)
print(p1 * p2)  # ['张三', '张三'] 本质是:pi.__mul__(p2)

# 练习 根据年龄排序
p3=Person(20,'张三','男')
p4=Person(25,'老王','男')
# 方法一 重载 > 运算符
ps=[p1,p2,p3,p4]
print(sorted(ps))

# 方法二 实参高阶函数
ps.sort(key=lambda item :item._age)
print(ps)

Supongo que te gusta

Origin blog.csdn.net/weixin_44628421/article/details/109235545
Recomendado
Clasificación