小白学python-------------面向对象之反射,内置方法__str__ , __del__

一.isinstance与issubclass

isinstance:判断是否是一个实例

issubclass:判断是否是子类

d={'a':1}
print(isinstance(d,dict))

class A:
    pass

class B(A):
    pass

print(issubclass(B,A))

二.反射

反射就是通过字符串来操作类或者对象的属性

hasattr

getattr

setattr

delattr

class People:
    country = 'China'

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

    def eat(self):
        print("%s is eating" % self.name)
        return '你拿到我了'

peo1 = People('tom')

#操作函数属性
#1.判断有没有
print(hasattr(People,'eat'))
#2.查取出来
print(getattr(People,'eat')(peo1))
#3.增
def func():
    return 'hello'
setattr(People,'speak',func())
print(People.__dict__)
#4.删除
print(People.__dict__)
delattr(People,'eat')
print(People.__dict__)


#操作数据属性
print(hasattr(peo1, 'name'))  # peo1.name
print(hasattr(peo1, 'eat'))  # peo1.eat

print(getattr(peo1,'xxx',None))#找不到属性就返回None
res=getattr(peo1,'name')
print(res)

setattr(peo1,'age',18)
print(peo1.age)

delattr(peo1,'name')

三.内置方法

__str__ :在对象被打印时自动触发,可以用来定义对象被打印时的输出信息,必须返回一个字符串的值.

              应该在方法内采集对象的相关的信息,然后根据需要拼成字符串的格式返回

__del__(析构方法):在对象被删除之前自动触发,可以用来做回收系统资源相关的事情.

__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('tom',18)
print(obj)


__del__

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.f=open('a.txt','r',encoding='utf-8')


    def __del__(self):
        # print('run..........')
        # 做回收系统资源相关的事情
        self.f.close()

obj = People('tom', 18)
# print(obj)
# del obj

print('主')

猜你喜欢

转载自blog.csdn.net/qq_42721964/article/details/81978753