Python 面向对象相关(补充)
super用于引用其他类的用法
- 使用super().方法名() ,此操作会优先从当前类的父类中寻找
- 如果父类中没有会找父类的父类,而不是找当前类
- 如果所有的父类中都没有,哪怕是自己本身有这种方法也会抛出错误
示例如下:
class New1(object):
def show1(self):
print('New1.show1')
def show3(self):
print('New1.show3')
class New2(New1):
def show1(self):
print('New2.show1')
def show2(self):
print('New2.show2')
class New3(New2):
def show1(self):
print('New3.show1')
def show2(self):
print('New3.show2')
def show3(self):
print('New3.show3')
def show4(self):
print('New3.show4')
def show(self):
self.show1()#self.会输出当前类的方法
super().show1()#super会从当前类的最近的父类寻找
super().show3()#如果最近的父类中没有,就会寻找最近的第二个父类
super().show4()#如果所有父类都没此方法,抛出异常,不会寻找本身方法
demo1=New3()
demo1.show()
运行效果如下:
特殊方法的补充
- str(self), 类中没有此方法,直接print该类实例化的对象时会直接输出地址
- 类中有该方法时,print会输出其返回的字符串,且必须返回对象是字符串类型如下:
class New(object):
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return '你好'
def show1(self):
print('New1.show1')
def show2(self):
print('New1.show3')
demo=New('小明',20)
print(demo)#此时输出的为 你好
- __doc__输出打印类的注释介绍,不需要定义,如下
class New(object):
'''
这是一个New类
'''
def show1(self):
'''
这是show1方法
'''
print('New1.show1')
demo=New()
print(demo.__doc__)#这里只输出打印类的注释,不会输出方法的注释
- dict, 将__init__(self)中封装的所有值以字典形式打印,不需要定义
class New(object):
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def show1(self):
print('New1.show1')
demo=New('小明',12,'男')
print(demo.__dict__)
#输出打印结果为:{'name': '小明', 'age': 12, 'gender': '男'}
- iter(self), 决定类是否可以被循环(是否可迭代),如果在类中定义了该方法,此时实例出来的对象为可迭代对象.
- 该方法要返回一个迭代器(生成器是特殊迭代器,也可使用),如下
#第一种
class New(object):
def __iter__(self):
yield 1
yield 2
yield 3
demo=New()
for item in demo:
print(item)#输出1,2,3
#第二种
class New(object):
def __iter__(self):
return iter([3,4,5])
demo=New()
for item in demo:
print(item)#输出3,4,5
isinstance/issubclass/tyep用法
- issubclass(类1,类2) , 判段类1是否是类二的派生类(子孙类),如果是返回True,不是返回False
- isinstance(对象,类) , 判断对象是否由该类(或基类)实例化的,如果是返回True,不是返回False
- type(对象) ,返回该对象是由哪个类创建的,并返回类名,如type(‘1’)==str,返回值为True
方法和函数的区别
- 函数需要自己传值,方法可以Python内部自动传值
- 直接print(对象名)时,看输出打印的结果,如果时function…就是函数, bound method…就是方法
- 也可以用from types import MethodType,FunctionType,引入后用isinstance(对象,类型)进行判断,例如:
#两种判断方式如下:
def fun1():
pass
class New:
def fun1(self):
pass
@staticmethod #这里是定义了一个函数
def fun2():
pass
@classmethod
def fun3(cls):
pass
print(fun1)#输出<function fun1 at 0x00000213D4B33E18>
print(New().fun1)#输出<bound method New.fun1 of <__main__.New object at 0x00000213D4A95668>>
print(New().fun2)#输出<function New.fun2 at 0x00000213D4B3AF28>
print(New().fun3)#输出<bound method New.fun3 of <class '__main__.New'>>
from types import MethodType,FunctionType
#引入MethodType判断是否为方法,FunctionType判断是否为函数
print(isinstance(fun1,MethodType))#输出False,这是函数
print(isinstance(fun1,FunctionType))#输出True
print(isinstance(New().fun1,MethodType))#输出True
print(isinstance(New().fun1,FunctionType))
print(isinstance(New().fun2,MethodType))#输出False,这是函数
print(isinstance(New().fun2,FunctionType))
print(isinstance(New().fun3,MethodType))#输出True
print(isinstance(New().fun3,FunctionType))