面向对象之内置方法

Posted surewing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之内置方法相关的知识,希望对你有一定的参考价值。

标签(空格分隔): 内置方法


面向对象里的内置方法:

一、isinstance(obj,cls)和issubclass(sub,super)

  • isinstance(obj,cls)检查是否obj是否是类cls的对象;
    例如:
class Foo(object):
    pass
obj=Foo()
isinstance(obj,Foo)
  • issubclass(sub,super)检查sub类是否是super类的派生类
    例如:
class Foo(object):
    pass
class Bar(Foo):
    pass
issubclass(Bar,Foo)

说一些主要的内置方法:

item系列:

查看属性

class Foo:
    def __init__(self,name):
        self.name=name
        
    def __getitem__(self,item):#获取对象的属性的内置方法,item='name'
        return self.__dict__.get(item)
        
    def __setitem__(self,key,value):
        print(key,value)
    def __delitem__(self,key):
        print(key)
        
obj=Foo('egon')
print(obj.__dict__)
#以前获取属性通过如下的代码:
obj.属性名字
#现在获取属性,item系列就是把obj模拟成字典形式,来访问
obj['name']#自动触发了__getitem__自动触发

设置属性

现在如果要设置属性呢?比如我们要设置:obj[‘sex‘]=‘male‘只要这样设置就,会触发__setitem__

class Foo:
    def __init__(self,name):
        self.name=name
        
    def __getitem__(self,item):#获取对象的属性的内置方法,item='name'
        return self.__dict__.get(item)
        
    def __setitem__(self,key,value):
        self.__dict__[key]=value
    def __delitem__(self,key):
        print(key)
        
obj=Foo('egon')
#设置属性
boj['sex']='male'
print(obj.__dict__)
print(obj.sex)

执行结果为:
[image.png-17.2kB][1]

删除属性:

  • del obj.name
    del obj[‘name‘],这个会触发,上述的__delitem__,so代码为:
class Foo:
    def __init__(self,name):
        self.name=name
    def __getitem__(self,item):#获取对象的属性的内置方法,item='name'
        return self.__dict__.get(item)
    def __setitem__(self,key,value):
        self.__dict__[key]=value
    def __delitem__(self,key):
        self.__dict__.pop(key)
obj=Foo('egon')

#删除属性
del obj['name']
print(obj.__dict__)

执行结果:
[image.png-18.6kB][2]

__str__系列:
以前我们说过{‘name‘:‘egon‘}这个字典其实就是本质就是我们 调用dict()这个类,然后把参数传进来而已,例如:
dict({‘ggname‘:‘egon‘})

如上述我们可以使用:d=dict({‘name‘:‘egon‘})
print(isinstance(d,dict))

执行结果:True
说明:d就是dict的一个实例;

  • 对于python自带的类,他们自带配备有打印的功能,打印出来的不是一个对象的地址:
    [image.png-62.5kB][3]

执行结果:
[image.png-29.6kB][4]

如上述我加入了:姓名和年龄,结果打印结果还是实力对象地址:
[image.png-91.1kB][5]
执行结果:
[image.png-19.8kB][6]

如上述的代码我们可以知道,对象实例化的时候对我们有用的属性有哪些:名字和年龄,那我们就需要定制一个方法,让他在print()这个对象的时候,就把对我有用的信息打印出来,这个内置的方法是什么呢?
是:

__str__方法:
[image.png-78.9kB][7]
其实当我们执行:print(obj)也就等于print(obj.str())

class People:
    def __init__(self,name,age):
        self.name =name
        self.age=age
    def __str__(self):
        return'<name:%s,age:%s>' %(self.name,self.age)
obj =People('egon',18)
print(obj)

如上述代码,在自动调取print(obj)的时候回,回自动去调取__str__这个方法;

del

之前我们学习过操作文件,

f=open('a.txt')
f.read()
f.close()

涉及到两方面的知识:上述代码的执行原理是;

a.txt是放在硬盘里面的,程序是不能直接操作硬盘的,程序是通过操作系统,然后有操作系统去操作硬盘的文件,所以我们在打开文件之后,要进行close,目的就是回收操作系统的资源,因为所有的资源不可能让你一直占用的;

  • 在你程序关闭之前,把操作系统的资源回收的;
class Open:
    def __init__(self,filename):
        self.filename=filename

    def __del__(self):
        print('del....回收操作系统资源,self.close()')
f=Open('setttings.py')
print('------main-------')#这是python 自动给你执行的del也可以自己执行:
del f # f.__del__()
  • 内置的——-del--(),在对象被删除的时候,python就自动调用__del__()这个方法;

以上是关于面向对象之内置方法的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象进阶之内置方法

面向对象之反射及内置方法

Python之面向对象:类的内置方法

Python学习第14篇:面向对象之反射以及内置方法

面向对象之内置方法续集

面向对象之isinstance与issubclass(python内置方法)