day18-面向对象进阶
类方法和静态方法
类中的方法分为:对象方法、类方法和静态方法
1.对象方法
怎么定义:直接定义在类中的函数
怎么调用:用对象来调用 -> 对象.对象方法()
特点:自带参数self;self调用的时候不用传参,指向当前对象(谁调用指向谁)
什么时候用:如果实现函数的功能需要用到对象属性,就将这个函数定义成对象方法
用对象调用对象方法,也叫给这个对象发一个消息
2.类方法
怎么定义:在类中,定义函数前加装饰器@classmethod
怎么调用:用类来调用 -> 类名.类方法()
特点:自带参数cls;cls调用的时候不用传参,指向当前类(谁调用指向谁或者谁的类)
什么时候用:实现函数的功能在不需要对象属性的前提下需要类(类属性),就使用类方法
3.静态方法
怎么定义:在类中,定义函数前加装饰器@staticmethod
怎么调用:用类来调用 -> 类名.静态方法()
特点:没有默认参数(相当于定义在类中的普通函数)
什么时候用:实现函数的功能不需要对象(对象属性)也不需要类(类属性)
继承
1.什么是继承
让子类直接拥有父类的属性和方法的过程就是继承
子类:继承者
父类:被继承者
2.怎么继承
"""
语法:
class 类名(父类列表):
类的内容
说明:
父类列表 - 父类1,父类2,父类3,....
注意:
如果定义类的时候没有写继承关系,那么这个类默认继承自 object 类(object是python的基类,所有的类都直接或者间接的继承它)
"""
3.在子类中添加内容
在子类拥有父类的属性和方法的基础上添加属于自己特有的属性和方法
1)添加类属性和方法
直接在子类中定义新的类属性和新的方法
2)添加对象属性
对象属性是通过继承父类的__ init __方法而继承到的
4.类和对象调用方法的顺序
先看当前类中有没有对应的方法,如果没有看父类中有没有,如果父类没有就看父类的父类,…以此类推,直到object都没有的时候才报错
重写
重写:在子类中重新定义父类中的方法
class A:
def func1(self):
print('A中的func1')
def func2(self):
print('A中的func2')
class B(A):
def func1(self):
super().func1()
super().func2()
print('B中的func1')
def func2(self):
pass
a = A()
b = B()
b.func1()
运算符重载
1.python中使用运算符的本质
在Python中同一个运算符在面对不同类型的数据的功能可以完全不一样
python在使用运算符的时候,其实是在通过数据去调用这个运算符对应的魔法方法
在Python中每一个运算符都对应的一个名字固体的魔法方法,指定类型的数据是否支持某种运算符,就看这个类中有没有实现这个运算符对应的魔法方法
对象属性的增删改查
class Student:
num = 100
__count = 200
def __init__(self, name, age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
self.__password = '123456'
def func1(self):
print(self.__password)
print(Student.__count)
self.__func2()
def __func2(self):
print('函数2')
stu1 = Student('小明')
stu2 = Student('张三')
# print(stu2.__password)
print('密码:', stu1._Student__password)
stu1.func1()
print(Student.num)
# print(Student.__count)
print('count:', Student._Student__count)
# stu1.__func2()
print(stu1.__dict__)
print('===============================================')
# 1.获取对象属性
# 1)对象.属性名
print(stu1.name)
# print(stu1.height) # 属性不存在会报错!
# 2)getattr(对象, 属性名)
print(getattr(stu1, 'name'))
# print(getattr(stu1, 'height')) # 报错
print(getattr(stu1, 'height', 180)) # 180
x = 'age'
print(getattr(stu1, x))
# 2.增、改
# 1)对象.属性 = 值
stu1.name = '小花'
print(stu1.name)
stu1.weight = 120
print(stu1.weight)
# 2)setattr(对象, 属性名, 值)
setattr(stu1, 'age', 20)
print(stu1.age) # 20
setattr(stu1, 'score', 100)
print(stu1.score) # 100
# 3.删
# 1) del 对象.属性
del stu1.age
# print(stu1.age) # AttributeError: 'Student' object has no attribute 'age'
# 2)delattr(对象, 属性名)
delattr(stu1, 'name')
# print(stu1.name) # AttributeError: 'Student' object has no attribute 'name'