我的Python成长之路--Day27--初接触面向对象高级

版权声明:此博客实属作者原创,转载请注明出处! https://blog.csdn.net/Onion_cy/article/details/83378028

今天我们介绍一下面向对象的高级内容,在介绍之前,吧面向对象基础部分的最后一点内容补充一下:

绑定方法与非绑定方法

类中定义函数分为了两大类:
    1. 绑定方法
        特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入

            绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
                                          绑定给对象的方法:对象和类都可进行调用,使用类进行调用时就是一个普通的函数,使用对象进行调用                                            时是一种绑定方法默认传入的是对象
            绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的
                                        绑定给类的方法:对象和类都可进行调用,使用类和使用对象进行调用产生的都是绑定方法,要注意的是绑                                          定方法默认传入的都是类

    2. 非绑定方法
        特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是                          一个普通函数,没有自动传值效果
        非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法

class Foo:
    def func1(self):           默认定义的函数为绑定方法的,默认自动传值传入的是对象
        print('func1',self)

    @classmethod
    def func2(cls):         经过classmethod装饰过后的函数为绑定方法的函数,这时候无论使用类还是对象来调用产生的都是绑定方法,自动传 
        print('func2',cls)   入的值为类

    @staticmethod       经过staticmethod装饰过后的函数为非绑定方法的函数,无论使用类还是对象来调用产生的都是普通的函数
    def func3(x,y):
        print('func3',x,y)

obj=Foo()
一.绑定给对象的方法
绑定给对象的,应该由对象来调,
obj.func1()                
print(obj.func1)     :<bound method Foo.func1 of <__main__.Foo object at 0x000002853557D6D8>>

绑定给对象的方法,类也可以调用,但是类调用就是一个普通函数,没有自动传值的效果
print(obj.func1)     :<bound method Foo.func1 of <__main__.Foo object at 0x000002853557D6D8>>
print(Foo.func1)   :<function Foo.func1 at 0x000001EC0B389950>
Foo.func1(obj)      就需要手动传入参数

二.绑定给类的方法
绑定给类的,应该由类来调,要注意使用类还是对象产生的都是绑定方法,并且默认传入的是类
print(Foo.func2)   :<bound method Foo.func2 of <class '__main__.Foo'>>     
print(obj.func2)    :<bound method Foo.func2 of <class '__main__.Foo'>>
Foo.func2()          :func2 <class '__main__.Foo'>
obj.func2()            :func2 <class '__main__.Foo'>          使用对象来调用效果也是默认传入类 的

三.非绑定方法 
非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果
print(obj.func3)    <function Foo.func3 at 0x0000023D85019A60>
print(Foo.func3)   <function Foo.func3 at 0x0000023D85019A60>

obj.func3(1,2)
Foo.func3(1,3)

到这里面向对象初级的内容就介绍完了,接下来会介绍一些面向对象高级中的一些知识
===========================================这是一条分割线=========================================

吾师讲解面向对象高级:http://www.cnblogs.com/linhaifeng/articles/6204014.html#_label1

反射:

反射就是通过使用字符串来操作类中的属性

之前对类中属性的操作都是通过调用来实现修改,添加删除这类操作的,操作起来比较麻烦,在python中可以使用反射的方法来操作类中的属性,通过字符串来反射类中的属性,实现和调用属性一样的功能,从而实现对类的属性的操作.
反射的几种方法:
hasattr     判断类中是否存在某个属性      hasattr(对象名/类名,属性名)
getattr     获取/查看类中的某个属性          getattr(对象名/类名,属性名,默认值)   在对象或者类中没有要获得的属性时,会返回默认值
setattr     修改/添加类中的属性                 setattr(对象名/类名,属性名,新的值)
delattr     删除类中的某个属性                  delattr(对象名/类名,属性名)
注意:类中属性是在定义__init__之前定义的,在__init__里面定义的为对象的属性,类的属性不包含__init__下的属性

class Foo:
    name = 111
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def tell_info(self):
        print('%s:%s' %(self.name,self.age))

obj=Foo('egon',18)
hasattr
print(hasattr(obj,'name')) #obj.name
print(hasattr(obj,'tell_info')) #obj.tell_info

getattr
res=getattr(obj,'name') #res=obj.name
print(res)
res=getattr(obj,'xxx',None)
print(res)

setattr
setattr(obj,'age',38)
setattr(obj,'sex','male')
print(obj.__dict__)
print(obj.sex)

delattr
delattr(obj,'name')
if hasattr(obj,'xxxxe'):
    delattr(obj,'xxxxe')
print(obj.__dict__)

内置函数:

isinstance        判断某个对象是否是某个类的实例    如:isinstance(obj,Foo)   表示判断obj是否是调用Foo产生的实例(对象)
issubclass       判断某个类是否是另一个类的子类    如:issubclass(Bar,Foo)  表示判断Bar是否是Foo的子类

几个内置方法:
在python中,__开头和__结尾的是一些满足一定条件自动触发的一些方法,在这里介绍几种在定义类时用到的几种方法
__str__:会在对象被打印的时候自动触发,将返回值传给打印对象的print打印出来
__del__:会在应用程序结束,释放内存的时候自动触发,作用是可以释放掉应用程序占用的操作系统的资源
              //会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源

__str__: 会在对象被打印时自动触发,然后将返回值返回给print功能进行打印
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        return '<%s:%s>' %(self.name,self.age)

peo=People('egon',18)
print(peo) #print(peo.__str__())    结果:<egon:18>

l=list([1,2,3])
print(l)

__del__: 会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源
class Foo:
    def __del__(self):
        print('===>')

obj=Foo()
# del obj
print('其他代码...')

class Bar:
    def __init__(self,x,y,filepath):
        self.x=x
        self.y=y
        self.f=open(filepath,'r',encoding='utf-8')
    def __del__(self):
        # 写回收系统资源相关的代码
        self.f.close()

obj=Bar(10,20)
del obj

猜你喜欢

转载自blog.csdn.net/Onion_cy/article/details/83378028