2018-09-07day15-类和对象(2)
一、内置类属性
内置类属性就是魔法属性
魔法属性:属性名的前面和后面有两个下划线
魔法方法:方法的前后都有两个下划线
1.__name__
属性 --- 类的名字(是个字符串)
类的属性
2.__class__
属性 --- 获取对象对应的类(是一个类)
对象的属性
3.__dict__
属性 --- 将对象和类的属性及其对应的值转换成键值对存到一个字典中
4.__doc__
属性 --- 获取类的说明文档
5.__model__
属性 --- 获取类所在模块对应的名字
6.__boss__
属性 --- 获取当前类的父类
二、slots魔法
通过__slots__
中存的元素的属性的值来约束当前这个类的对象的属性,对象的属性只能比元祖中的元素少,不能多!
class Person:
__slots__ = ('name','age','face')
def __init__(self):
self.name = '张三'
self.age = 18
self.face = 70
# self.sex = 'boy' # __slots__中并没有sex()
注意:一旦在类中给__slots__
属性赋了值,那么这个类的对象的__dict__
属性就不能用了
三、属性的私有化
python中并没有真正的私有化
python的类中默认的属性和方法都是公开的
1.私有化
- a.类中的属性和方法都可以通过在属性名前面加两个下划线,来让属性和方法变成私有的
- b.私有的属性和方法只能在当前的类中使用
2.私有化的原理
在前面有两个下划线的属性名和方法名前添加了_类名
来阻止外部通过直接访问属性名来使用属性
四、属性的setter和getter
1.保护类型的属性:
- a.就是在声明对象属性的时候在属性名前加一个下划线来代表这个属性是受保护的属性。
- b.如果一个属性已经声明成保护的属性,那么我们就需要给这个属性添加getter,也可以添加setter
2.添加getter
添加getter其实就是声明一个没有参数有一个返回值的函数
a.格式:
@property
def 去掉下划线的属性名(self):
函数体
将属性相关的值返回
b.使用场景
场景一:如果先要获得对象的某个属性的值之前,想要干点别的事情,就可以给这个属性添加getter
场景二:想要拿到某个属性被使用的时刻
3.添加setter
a.格式:
@去掉下划线的属性名.setter
def 去掉下划线的属性名(self,参数):
self.属性名 = 参数
b.使用场景
在给属性赋值前想要干点别的事情,就给属性添加setter
五、继承
python中的类可以继承,并且支持多继承。
程序中的继承:就是让子类直接拥有父类的属性和方法(继承后父类中的内容不会因为被继承而减少)
1.继承的语法
class 类名(父类):
类的内容
注意:如果声明类的时候没有写继承,那么这个类会自动继承python的基类--object;相当于class类名(object)
,python中的所有类都是直接或间接的继承自object
2.能继承哪些东西
- a.所有的属性和方法都能继承
- b.
__slots__
的值不会继承,但是会影响子类的__slots__
属性,不能获取到父类继承下来的属性
六、方法的重写
子类继承父类,拥有了父类的属性和方法以后,还可以添加自己的属性和方法
1.添加方法和类的字段
直接在子类中声明相应的方法
2.添加对象的属性
对象的属性是通过继承父类的init方法而继承下来的,如果想要保留父类的对象的同时,添加自己的对象属性,需要在子类的init方法中通过super()
去调用父类的init方法
3.方法的重写
在子类中重新实现父类的方法,就是重写
方式一:直接覆盖父类的实现
方式二:保留父类的功能在添加其他功能
4.类中方法的调用过程
先在当前这个类中去找,没有就去父类中找,找不到再去父类的父类中找,依次类推,如果在基类中都没有找到才崩溃,在第一次找到的位置去调用
注意:使用super的时候必须是通过super()来代替父类或者是父类对象
七、运算符的重载
如果希望类的对象支持相应的运算符操作(例如:+, -, *, /, >, <),就必须实现相应的魔法方法
这个过程就叫运算符的重载
+:add()
>:gt()
...
一般情况需要对>或者<进行重载,重载后可以通过sort方法直接对对象的列表进行排序
# 重载 + 符号
# self:+前面的对象
# other:+后面的对象
def __add__(self, other):
return self.score+other.score
# 重载 > 符号
# 注意:重载 > 和 < 可以只重载一个,另外一个对应的功能自动取反
def __gt__(self, other):
return self.age>other.age
# 重写魔法方法__str__,用来定制对象的打印样式
def __str__(self):
return str(self.__dict__)