Python 面向对象相关(补充)

Python 面向对象相关(补充)

super用于引用其他类的用法
  1. 使用super().方法名() ,此操作会优先从当前类的父类中寻找
  2. 如果父类中没有会找父类的父类,而不是找当前类
  3. 如果所有的父类中都没有,哪怕是自己本身有这种方法也会抛出错误
    示例如下:
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()

运行效果如下:
1

特殊方法的补充
  1. str(self), 类中没有此方法,直接print该类实例化的对象时会直接输出地址
  2. 类中有该方法时,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)#此时输出的为 你好
  1. __doc__输出打印类的注释介绍,不需要定义,如下
class New(object):
    '''
    这是一个New类
    '''
    def show1(self):
        '''
        这是show1方法
        '''
        print('New1.show1')
demo=New()
print(demo.__doc__)#这里只输出打印类的注释,不会输出方法的注释
  1. 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': '男'}
  1. iter(self), 决定类是否可以被循环(是否可迭代),如果在类中定义了该方法,此时实例出来的对象为可迭代对象.
  2. 该方法要返回一个迭代器(生成器是特殊迭代器,也可使用),如下
#第一种
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用法
  1. issubclass(类1,类2) , 判段类1是否是类二的派生类(子孙类),如果是返回True,不是返回False
  2. isinstance(对象,类) , 判断对象是否由该类(或基类)实例化的,如果是返回True,不是返回False
  3. type(对象) ,返回该对象是由哪个类创建的,并返回类名,如type(‘1’)==str,返回值为True
方法和函数的区别
  1. 函数需要自己传值,方法可以Python内部自动传值
  2. 直接print(对象名)时,看输出打印的结果,如果时function…就是函数, bound method…就是方法
  3. 也可以用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))
发布了66 篇原创文章 · 获赞 7 · 访问量 2367

猜你喜欢

转载自blog.csdn.net/qq_45894553/article/details/105227438