issubclass和isinstance,反射,内置方法

目录

  • 面向对象进阶
  • 一、issubclass 和 isinstance
    • 1.1 issubclass
    • 1.2 isinstance
  • 二、反射
    • 2.1 什么是反射
    • 2.2 四个可以通过字符串操作对象属性和方法的内置函数
      • 2.2.1 hasattr()
      • 2.2.2 getattr()
      • 2.2.3 setattr()
      • 2.3.4 delattr()
  • 三、内置方法
    • 3.1 __str____repr__
    • 3.2 点拦截方法:__setattr__,__delattr__,__getattr__
    • 3.3 __item__
    • 3.4 __call__
    • 3.5 __enter____exit__

面向对象进阶

一、issubclass 和 isinstance

1.1 issubclass

issubclass()

作用:用来判断括号内的第一个类是不是第二个类的子类,返回结果为True或False。

例如:

class A:
    pass
class B(A):
    pass
class C:
    pass

print(issubclass(B,A))  # True
print(issubclass(C,A))  # False

1.2 isinstance

isinstance()

作用:用来判断括号内第一个参数是不是第二个参数的对象,返回结果为True或False。

例如:

class A:
    pass
class B:
    pass

a = A()
print(isinstance(a,A))  # True
print(isinstance(a,B))  # False

二、反射

2.1 什么是反射

通过字符串来判断、获取、设置、删除对象(包括类、模块等,一切皆对象)中的属性或方法。

2.2 四个可以通过字符串操作对象属性和方法的内置函数

四个函数括号里的第一个参数都是对象

hasattr(): 判断一个属性是否在对象中,返回True或者False

getattr(): 通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法

setattr(): 通过字符串来设置属性或方法

delattr(): 通过字符串来删除属性或方法

2.2.1 hasattr()

判断一个属性是否在对象中,第一个参数是对象,第二个参数是属性,返回True或False

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
cmd=input('请输入命令:')
if hasattr(p,cmd):  # 先判断属性cmd是否在对象p中
    run=getattr(p,cmd)   # 如果输入run,该属性或方法就在对象p中,就会返回,加括号就可以调用
    run()
else:
    print('该命令不存在')  # 输入的属性不在对象中的话,就执行这步

2.2.2 getattr()

通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法,用法在上面的代码里已经写了

2.2.3 setattr()

1、通过用户输入key和value往对象中赋值

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
key=input('请输入key:')  # 输入age
value=input('输入value:')  # 输入18
setattr(p,key,value)  # 将{'ag':'18'}赋值给对象p
print(p.age)  # 18

2、动态的往对象中放方法

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
def test(a):
    print(a)
print(p.__dict__)  # {}
setattr(p,'test',test)
print(p.__dict__)  # {'test': <function test at 0x000001DF69C81E18>}
p.test(0) # 0

2.3.4 delattr()

动态删除对象p中属性为变量a的属性

class Foo:
    def run(self):
        print('run')
    def speak(self):
        print('speak')

p=Foo()
p.name='lqz'
p.age=18
p.sex='male'
a=input('请输入要删除的属性:')  # 输入sex
print(p.__dict__)  # {'name': 'lqz', 'age': 18, 'sex': 'male'}
delattr(p,a)   #把属性sex删除
print(p.__dict__)  # {'name': 'lqz', 'age': 18}
# 直接p.a是不对的
# del p.a  这个会报错

三、内置方法

之前学过__init__

3.1 __str____repr__

1、__str__:如果不重写__str__,print打印会打印出内存地址,如果重写了,会打印出你想要的

2、__repr__:和__str__类似,在交互式命令下直接写变量名,会执行__repr__

class Foo:
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return '['+self.name+']'

f=Foo('nick')
print(f.__str__())  # [nick]
print(f)     #相当于上面那句  # [nick]
l=[1,2,3]
#本质也是已经调用list的__str__方法
print(l)

3.2 点拦截方法:__setattr__,__delattr__,__getattr__

如果去对象中获取属性,一旦取不到,会进入到__getattr__

如果去对象中赋值属性,一旦取不到,会进入到__setattr__

如果删除对象中的属性,会进入__delattr__

class Foo:
    def __init__(self,name):
        self.name=name
    def __getattr__(self, item):
        # print('xxxx')
        return '你傻逼啊,没有这个字段'
    def __setattr__(self, key, value):
        print('yyyyy')
    def __delattr__(self, item):
        print('zzzzz')
f=Foo('nick')  # 给对象f赋值属性,对象中没有这个属性,进入到__setattr__方法  # yyyyy
print(f.name)  # 获取name属性,对象中没有属性,进入__getattr__方法  # 你傻逼啊,没有这个字段
print(f.age)   # 没有age属性,进入__getattr__方法  # 你傻逼啊,没有这个字段
print(f.__dict__)   # {}
print(f.name)  # 没有name属性,进入__getattr__方法  # 你傻逼啊,没有这个字段
f.sex='male'   # 给对象f赋值属性,对象中没有sex这个属性,进入到__setattr__方法  # yyyyy

del f.name    # 删除对象name属性,对象中没有这个属性,进入__delattr__方法  # zzzzz
print(f.__dict__)  # {}

3.3 __item__

对象通过[] 中括号取值、赋值、删除值得时候会调用__item__方法

class Foo:
    def __init__(self, name):
        self.name = name
    def __getitem__(self, item):
        name=getattr(self,item)
        # print(name)
        # print(self.__dict__[item])
        return name
        # return self.__dict__[item]
    def __setitem__(self, key, value):
        print('obj[key]=lqz赋值时,执行我')
        self.__dict__[key] = value
    def __delitem__(self, key):
        print('del obj[key]时,执行我')
        self.__dict__.pop(key)
f=Foo('nick')
print(f['name'])

3.4 __call__

对象加括号会调用它

class Foo:
    def __call__(self):
        print('xxxx')

f=Foo()
f()  # xxxx

3.5 __enter____exit__

with管理上下文的本质

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

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
        # return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')

with Open('a.txt') as f:
    print('=====>执行代码块')
    # print(f,f.name)
出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
=====>执行代码块
with中代码块执行完毕时执行我啊
  • exit()中的三个参数分别代表异常类型,异常值和追溯信息,with语句中代码块出现异常,则with后的代码都无法执行
class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')
        print(exc_type)
        print(exc_val)
        print(exc_tb)

try:
    with Open('a.txt') as f:
        print('=====>执行代码块')
        raise AttributeError('***着火啦,救火啊***')
except Exception as e:
    print(e)

出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
=====>执行代码块
with中代码块执行完毕时执行我啊
<class ‘AttributeError‘>
着火啦,救火啊
<traceback object at 0x1065f1f88>
着火啦,救火啊

  • 如果__exit()返回值为True,那么异常会被清空,就好像啥都没发生一样,with后的语句正常执行
class Open:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行我啊')
        print(exc_type)
        print(exc_val)
        print(exc_tb)
        return True

with Open('a.txt') as f:
    print('=====>执行代码块')
    raise AttributeError('***着火啦,救火啊***')
print('0' * 100)  #------------------------------->会执行

出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量
=====>执行代码块
with中代码块执行完毕时执行我啊
<class ‘AttributeError‘>
着火啦,救火啊
<traceback object at 0x1062ab048>
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

原文地址:https://www.cnblogs.com/zhuangyl23/p/11449534.html

时间: 2024-10-09 08:14:30

issubclass和isinstance,反射,内置方法的相关文章

反射 内置方法

# isinstance()判断对象所属类型,包括继承关系 判断对象# class A:pass# class B(A):pass# b=B()# print(isinstance(b,B))# b属于 B# print(isinstance(b,A))# b属于 A##ssubclass() 判断类与类之间的继承关系# class A:pass# class B(A):pass# print(issubclass(B,A))# b属于 B# print(issubclass(A,B))# A不

python基础27——反射&amp;内置方法

反射 什么是反射? 指的是在程序运行过程中可以"动态(不见棺材不掉泪)"获取对象的信息 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) 什么是反射机制? 反射机制指的是在程序的运行状态中 对于任意一个类,都可以知道这个类的所有属性和方法 对于任意一个对象,都能够调用他的任意方法和属性 这种动态获取程序信息以及动态调用对象的功能称为反射机制 如何实现反射? class People: def __init__(self,

27 isinstance与issubclass、反射、内置方法

isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回False class Bar: pass class Foo(Bar): pass print(issubclass(Foo,Bar))#输出一个True obj=Foo() print(isinstance(obj,Foo))#输出一个True 反射 反射:通过字符串来反射/映射到对象/类的属性上 c

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

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

day27 反射、内置方法

一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) # print(isinstance(s,Son)) # print(isinstance(s,Foo)) # print(type(s) is Son) # print(type(s) is Foo) #判断一个类是不是另一类的子类,传两个参数(子类,父类) print(issubclass(So

面向对象的进阶---反射--一些内置方法

反射 反射和一些类的内置方法 1 isinstance ---- issubclass type()--判断 是不是 ininstance(object,cls) 判断 是不是类的对象 如果这个类有父类 这个对象也是这个父类的对象 issubclaaa(cls,cls) 判断一个类是不是另一个类的子类 ============================= 反射 ================================= 把一个字符串 类型的变量 变成一个 真实存在这个程序中的变量名

python全栈开发【第十七篇】面向对象反射和内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

面向对象:反射、内置方法

反射:通过字符串映射到对象或者类的属性 反射的方法: class People: country = "China" def __init__(self,name,age): self.name = name self.age = age def talk(self): print("%s is talking" % self.name) obj = People("neo",22) """ 判断是否拥有某个属性:

1、面向对象内置函数 2、反射 3、内置方法

1.isinstance()    判断对象所属类型,包括继承关系 2.issubclass() 判断类与类之间的继承关系 class A:pass class B(A): pass print(isinstance(b,B))   # o,t print(isinstance(b,A))  #  o,t class mystr(str): pass ms = mystr("alex") print(type(ms) is str)  # 不包含继承关系,只管一层 print(isin