多继承和魔法方法
一、多继承
1、类的定义(首字母必须大写)
其实就是某一类事物的的统称,描述了某一事物的共性
class Person: #定义一个Person类
pass #pass就是在这里执行任何操作,占一个位置
wum = Person() #wum 就是Person类的一个实例
wum.age = 10 #在实例中添加的属性,只能在此实例中查找到
运算符:“.” 调用类的属性或者方法
(查找变量var)------> 实例:如果实例中找不到,去类里面找--------->person类(var变量)
私有属性
在python中有两种私有属性,分别是在属性前面加一个下划线(_)和两个下划线(__),一个下划线的属性在外部可以直接访问,但是两个下划线的在外部不可以直接访问。
class Person(object):
_sex = '男'
__age = 18
wum = Person()
print(wum._sex) #可以直接访问_sex这个属性
print(wum.__age) #报错 Error,不可以直接访问__age这个属性
私有属性:在python中,_和__的使用更多的是一种规范/约定,没有真正限制目的
wum._Person__age
可以直接访问私有属性实例._类名+私有属性
2、方法
3、初始化和析构
初始化方法:__init__(self)
析构问题;
通常在实例被销毁的过程中执行的方法叫析构析构函数:例如__del__
就是一个析构函数了,当使用’del’删除对象的时候,会调用它本身的析构函数。
del只删除的是指向,并没有删除内存空间的值。
class Person():
def __init__(self):
print('我被创建了')
def __del__(self):
print('我被销毁了')
wum = Person() #打印'我被创建了'
del wum #打印'我被销毁了'
二、魔法方法和魔法属性
print(Person,__mro__) #输出的是Person继承的所有类和继承顺序
重写魔法方法,修改代码新篇章
class Person:
def __add__(self, other):
print('我被制订了新的加法规则')
A = Person()
A + 1
输出结果:
我被制订了新的加法规则
Process finished with exit code 0
其他的类似魔法方法:
__add__(self,other) #x+y
__sub__(self,other) #x-y
__mul__(self,other) #x*y
__mod__(self,other) #x%y
__iadd__(self,other) #x+=y
__isub__(self,other) #x-=y
__radd__(self,other) #y+x
__rsub__(self,other) #y-x
__imul__(self,other) #x*=y
__imod__(self,other) #x%=y
字符串问题的引入
str和repr原理
class Recttangle:
def __init__(self,length,width):
self.length = length
self.width = width
def area(self):
areas = self.length * self.width
return areas
def __str__(self):
return 'length is %s,width is %s'%(self.length,self.width)
def __repr__(self):
return 'area is %s'%self.area()
在python中,str和repr 方法在处理对象的时候,分别调用的是对象__str__
和__repr__
方法,print打印对象,调用的是str函数,如果对象没有实现__str__
,则调用__repr__
方法处理,在交互模式下,直接输出对象,显示__repr__
的返回值
- 类里面定义了
__str__
时调用print
class Person:
def __str__(self):
return 'str'
def __repr__(self):
return 'repr'
A = Person()
print(A)
输出结果:
repr
- 类里面没有定义
__str__
时调用print
class Person:
def __repr__(self):
return 'repr'
A = Person()
print(A)
输出结果
repr
__call__
方法
正常情况下,实例是不能像函数一样被调用的,要想实例能够被调用,就需要定义__call__
方法
class Rectangle:
def __init__(self,length,width):
self.length = length
self.width = width
def __call__(self, *args, **kwargs):
print('调用了__call__方法')
a = Rectangle(2,5)
a()
输出结果:
调用了__call__方法
类中一些查询相关信息的方法
-
__class__
查看类名,格式:实例.__class__
-
__dict__
查看所有属性,返回属性和属性键值对形式- 格式:
实例.__dict__
- 格式:
-
__doc__
查看对象文档,即类中(用三个引号引起来的部分)- 格式:
实例.__doc__
- 格式:
-
__bases__
查看直接父类,- 格式:
类名.__bases__
- 格式:
-
__mro__
查看多继承的情况下,子类调用父类的方法时,搜索顺序-
格式:
子类名.__mro__
实例.__class__.__mro__
-