python ==》 面向对象的反射,(isinstance and issubclass)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python ==》 面向对象的反射,(isinstance and issubclass)相关的知识,希望对你有一定的参考价值。

1.staticmethod:(静态方法)

静态方法:让类里的方法直接被类调用,就像正常的函数一样。

class Staticmethod_Demo():
    role = ‘Aray‘

    @staticmethod
    def func():
        print(‘当普通方法用‘)
Staticmethod_Demo.func()

输出结果:
当普通方法用

2.classmethod:(类方法)

类方法:默认参数为:cls  ,可以直接用类名调用,可以与类属性交互。

class Classmethod_Demo():
    role = ‘Aray‘

    @classmethod
    def func(cls):
        print(cls.role)
Classmethod_Demo.func()


输出结果:
Aray

共同点:

  1.都可以直接被类调用,不需要实例化

不同点:

  1,类方法必须有一个cls参数表示这这个类,静态方法不需要,不能直接被使用。

绑定方法: 普通方法   类方法

非绑定方法:  静态方法

目前为止学的方法有:

  普通方法:默认有一个self对象传进来,并且只能被对象调用

  类方法:默认有一个cls传进来表示本类,并且可以被类和对象调用

  静态方法:没有默认参数,并且可以被类和对象调用。(这个方法不推荐使用)

3.isinstance

isinstance 作用是: 判断一个对象是不是这个类的对象,传两个参数,分别是对象和类,如果是,返回true,否则,为false。

class Foo:
    pass
class Son(Foo):
    pass
s = Son()  #实例化
print(isinstance(s,Son)) #判断一个对象是不是这个类的对象,传两个参数,分别是 对象和类
print(isinstance(s,Foo))
print(type(s) == Son)   #精准判断
print(type(s) == Foo)

输出结果:
True
True
True
False

4.issubclass

issubclass: 判断一个类是不是另一个类的子类,传两个参数,分别是子类和父类

class Foo:
    pass
class Son(Foo):
    pass
s = Son()  #实例化

print(issubclass(Son,Foo))  #判断一个类是不是另一个类的子类,传两个参数,分别是子类和父类
print(issubclass(Son,object))
print(issubclass(Son,Son))
print(issubclass(Foo,object))
print(issubclass(Foo,Son))

输出结果:
True
True
True
True
False

二:反射

反射:要求掌握 (多用在网络相关方面)。定义:可以用字符串的方式去访问对象的属性,调用对象的方法。

常用:

  hasattr:

  getattr:

hasattr和getattr通常是一起用的。一个检测,一个获取。

class Black_one:
    feature = ‘ugly‘
    def __init__(self,name,addr):
        self.name = name
        self.affr = addr

    def sell_house(self):
        print(‘%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼呢?‘%self.name)
    def rent_house(self):
        print(‘%s 黑中介介绍租房子啦,傻逼才租啊‘%self.name)

b1 = Black_one(‘天地三清‘,‘道法无常‘)
#检测是否含有属性
print(hasattr(b1,‘name‘))
print(hasattr(b1,‘sell_house‘))

#获取属性
n = getattr(b1,‘name‘)
print(n)
func = getattr(b1,‘sell_house‘)
func()

print(getattr(b1,‘aaaa‘,‘不存在‘))

输出结果:
True
True
天地三清
天地三清 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼呢?
不存在

不常用:

  setattr:

#设置属性(新增)
print(b1.__dict__)
setattr(b1,‘SB‘,True)
setattr(b1,‘time‘,‘1年‘)
print(b1.__dict__)

输出结果:{‘name‘: ‘天地三清‘, ‘addr‘: ‘道法无常‘}
{‘name‘: ‘天地三清‘, ‘addr‘: ‘道法无常‘, ‘SB‘: True, ‘time‘: ‘1年‘}

  delattr:

delattr(b1,‘addr‘)
delattr(b1,‘time‘)
print(b1.__dict__)

输出结果:
{‘name‘: ‘天地三清‘, ‘addr‘: ‘道法无常‘, ‘SB‘: True, ‘time‘: ‘1年‘}
{‘name‘: ‘天地三清‘, ‘SB‘: True}

内置方法:

str and repr

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

    def __str__(self):
        return ‘%s obj info in str‘%self.name

    def __repr__(self):
        return ‘obj info in repr‘

f = Foo(‘egon‘)
print(f)
print(‘%s‘%f)
print(‘%r‘%f)

输出结果:
egon obj info in str
egon obj info in str
obj info in repr

-del-:  如果没有手动删除,系统默认最后会del。

class Foo:
    def __del__(self):
        print(‘执行我啊!‘)
f = Foo()
print(123)
print(123)
print(123)
del f
print(123)
print(123)
print(123)


输出结果:
123
123
123
执行我啊!
123
123
123

item 系列:

 











以上是关于python ==》 面向对象的反射,(isinstance and issubclass)的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象 | 反射

Python面向对象反射,双下方法

Python面向对象之反射,双下方法

python面向对象的反射

Python-面向对象之反射

python面向对象高级:反射魔法方法元类