5多继承和魔法方法

多继承和魔法方法

一、多继承

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__

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值