day18
回顾
定义类
class 类名:
说明文档
类的内容(属性和方法)
对象方法
构造函数,__init__
属性
类属性
对象属性
def Person():
创建对象(调用__new__方法)
初始化对象(通过对象调用__init__方法)
返回对象
对象属性的增删改查
# 在打印一个对象的时候,系统会自动用这个对象去调用__repr__方法,并且获取这个方法的返回值,返回值是什么就打印什么(返回值必须是字符串)
查
获取对象属性的值
对象.属性
getattr(对象,属性名)
# 1.getattr可以做到动态获取属性的值
# value = input('请输入要获取的属性的属性名:')
# print(getattr(stu1, value))
# 2.
# print(stu1.height) # 报错
# print(getattr(stu1, 'height'))
# print(getattr(stu1, 'height', 20))
增/改
对象.属性 = 值
setattr(对象,属性名,值)
# 属性存在就是改
stu1.name = '小红'
setattr(stu1, 'tel', '199')
print(stu1)
# 属性不存在就是增加
stu1.height = 170
setattr(stu1, 'weight', 130)
print(stu1)
删
del 对象.属性
delattr(对象, 属性名)
del stu1.study_id
print(stu1)
delattr(stu1, 'score')
print(stu1)
类方法和静态方法
对象方法
对象方法
怎么定义:直接定义
怎么调用:对象.方法名()
特点:self
什么时候用:如果实现函数的功能需要用到对象属性,那么这个函数就定义成对象方法
类方法
类方法
怎么定义:在定义函数前加装饰器@classmethod
怎么调用:类.方法名()
特点:有个默认值cls,这个参数在调用的时候不用传参,系统会自动将当前类传给cls
什么时候用:实现函数的功能在不需要对象属性的前提下需要类就使用类方法
静态方法
静态方法
怎么定义:在定义函数前加装饰器@staticmethod
怎么调用:类.方法名()
特点:没有默认参数(相当于类中的普通函数)
什么时候用:实现函数的功能在不需要对象属性的前提下不需要类就使用静态方法
内置类属性
doc -获取类的说明文档
p1 = Person()
print(Person.__doc__)
print(str.__doc__)
# 类.module - 获取指定类所在模块
print(Person.__module__) # __main__
print(list.__module__) # builtins
# 对象.class - 获取指定对象对应的类型,和type(对象)功能一样
print(p1.__class__) # <class '__main__.Person'>
print(type(p1)) # <class '__main__.Person'>
print(Person) # <class '__main__.Person'>
print('abc'.__class__) # <class 'str'>
# 类.name - 获取类名
print(Person.__name__)
print(int.__name__)
# 类.__dict__ - 将类转换成字典,key是字段名,值是字段对应的值
# 对象.__dict__ - 将对象转换成字典,对象属性名作为key,属性值作为value
print(Person.__dict__)
print(p1.__dict__)
# 类.__base__ - 获取指定类的父类
# Person.__base__ - 获取指定类所有的父类
# object是Python中所有类的基类
print(Person.__base__) # <class 'object'>
print(Person.__base__) # (<class 'object'>,)
getter和setter
getter
getter
什么时候用:在获取对象属性前,如果要别的什么事情,就可以给这个属性添加getter
怎么用:
第一步:在需要添加getter的属性的属性名前加_
第二步:在@property后面定义一个函数:
函数名就是属性名去掉_
函数没有参数,需要一个返回值(返回值就是获取这个属性真正得到的结果)
第三步:通过对象获取属性的时候,属性不需要带_
setter
setter
什么时候用:如果要在给某个对象属性赋值之前做别的什么事情,就给这个属性添加setter
怎么用:
第一步:在需要添加setter的属性的属性名前加_
第二步:在装饰器@getter名.setter后面定义一个函数:
函数名就是属性名去掉_
函数有一个参数(这个参数指向的时候赋值的时候赋的值),没有返回值
第三步:通过对象给属性赋值的时候,属性不需要带_
私有化
访问权限
三种访问权限:
公开的:公开的属性和方法在类的内部,外部都可以用,并且可以被继承
保护的:保护的属性和方法在类的内部可以用,外部不能用,但是可以继承
私有的:私有的属性和方法在类的内部可以用,外部不能用,不能被继承
Python中的属性和方法只有一种访问权限:公开的,所谓的私有化其实是假的
私有化的方法:在属性名和方法前加_(注意:只能是两个__开头,不能再用__结尾)
运算符重载
运算符
python在使用运算符的时候,本质是在调用元素安抚对应的方法
每个运算符对应的方法的方法名是固定的,每个运算符对应的方法的方法名是固定的
不同类型的数据在参数相同的运算符的时候,会调用不同类中对应方法
某个类型的数据是否支持某种运算,就看这个数据对应的类型中有没有实现这个运算符对应
class Person:
def __init__(self, name='小明', age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'