类的内置方法

一、isinstance()和issubclass()

class Foo:
    pass

class Son(Foo):
    pass

f = Foo()

# 判断对象是不是类的对象
print(isinstance(f,Foo))  # isinstance(f,Foo)需要两个参数,第一个是要坚持的对象,第二个是对象属于的类。是返回True,不是返回False

# 判断两个类是不是派生类
print(issubclass(Son,Foo)) # issubclass()需要传两个参数,第一个是要坚持的对象,第二个是父类。是则返回True,不是返回False

二、反射

反射:主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)

class Foo:
    pass

class Son(Foo):
    pass

f = Foo()

# 判断对象是不是类的对象
print(isinstance(f,Foo))  # isinstance(f,Foo)需要两个参数,第一个是要坚持的对象,第二个是对象属于的类。是返回True,不是返回False

# 判断两个类是不是派生类

print(issubclass(Son,Foo)) # issubclass()需要传两个参数,第一个是要坚持的对象,第二个是父类。是则返回True,不是返回False


# 反射:通过字符串来映射对象的属性,即通过字符串的输入来执行相应功能的代码 eval()

class People:

    def __init__(self,name,age):
        self.name = name
        self.age = age

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

    @staticmethod
    def trys():
        return 'trys'

p = People('夏天',25)

# 判断对象面是否有相应的属性,hasattr(obj,str)有两个参数,obj是要判断的对象,str必须是字符串类型的变量,代表obj对象里面有无str的变量

print(hasattr(p,'name')) # 实际上是在判断p.__dict__['name']字典里面有没有name的变量
print(hasattr(p,'talk')) # 判断p里面有没有talk的函数属性

# 获取属性的值
# getattr(obj,str,default) 有三个参数,最后一个参数可以不填,str中的参数必须是字符串
n = getattr(p,'name')   # 实际上是获取p.name的值
print(n)
b = getattr(p,'name456','数据出错')  # 填了第三个参数,如果出错则会打印定义好的错误信息
print(b)

fun = getattr(p,'talk')
fun()

print(getattr(People,'trys'))   # 反射类

# 修改对象参数
# setattr(obj,str,val)里面有三个参数,第二个参数是要修改对象的属性参数,第三个是修改后的值
a = setattr(p,'name','big') # 实际上是与p.name='big'等效
print(p.name)

setattr(People,'country','china')
print(getattr(p,'country'))

# 删除属性

delattr(p,'name')
print(p.__dict__)

# 反射当前模块成员
import sys
def s1():
    print('s1')


def s2():
    print('s2')


this_module = sys.modules[__name__]

a = hasattr(this_module, 's1')
b = getattr(this_module, 's2')
print(a)
b()

使用例子:

# 使用例子

class Service:

    def run(self):
        while True:
            inp = input('>>:').strip()
            cmd = inp.split()
            if hasattr(self,cmd[0]):
                func = getattr(self,cmd[0])
                func(cmd[1])

    def get(self,cmd):
        print('get.....',cmd)

    def put(self,cmd):
        print('put.....',cmd)



obj = Service()
obj.run()

三、getitem,setitem,delitem:

此系列相当于将对象或者类的属性名称和对应的值对应起来,形成像字典的结构{‘item’:value}

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def func(self):
        print('from func')

    def __getitem__(self, item):
        print('getattr><')

        return self.__dict__[item]          # 当输入的不是字典中的key时会报错
        # return self.__dict__.get(item)    # 当输入的不是字典中的key时不会报错


    def __setitem__(self, key, value):
        print('setattr><')
        print(key,value)
        self.__dict__[key]= value

    def __delitem__(self, key):
        print('delitem><')
        # del self.__dict__[key]
        self.__dict__.pop(key)

f = Foo('夏天',25)
print(f.__dict__)
# print(f['age'])

f['name'] = 'tiantian'
print(f.name)

del f['name']
print(f.__dict__)


四、str

打印对象时可以定制需要打印对象的那些信息,而不是打印出来一个对象

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):   # 会在打印对象时触发此方法
        print('str><')
        return 'name:%s  age:%s'%(self.name,self.age)  # __str__方法必须要有返回值,返回值必须是字符串
f = Foo('夏天',18)
print(f)                        # 打印对象是直接打印定制化的输出

五、del

python在程序运行完成后会自动回收程序内定义的名称空间资源,不会回收申请的操作系统资源,要回收操作系统资源则需要给操作系统发指令,如文件操作中的f.close()就是给操作系统信号。
在类中可以用__del__来回收回收和对象相关连的资源,如:申请的操作系统资源

class Open:

    def __init__(self,filename):
        print('open file...')
        self.filename = filename

    def __del__(self):          # 在不调用此方法时,在程序结束后会自动触发,回收与对象相关的资源。
        print('回收资源....')    # 相当于文件操作中的f.clos()


f = Open('setting.py')
del f
print('---finish----')
输出结果:
open file...
回收资源....
---finish----
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值