Python之面向对象进阶------反射(Day26)

Posted

tags:

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

 

classmethod

class Classmethod_Demo():
    role = dog

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


Classmethod_Demo.func()

staticmethod

class Staticmethod_Demo():
    role = dog

    @staticmethod
    def func():
        print("当普通方法用")

Staticmethod_Demo.func()

classmethod 和staticmethod的区别

classmethod:我们把它叫做类方法

staticmethod:我们把它叫做静态方法

在python中,静态方法和类方法都是可以通过类对象和类对象实例访问,但是区别是:

[email protected]:是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的叫作实例方法,类方法的参数是cls,而实例方法的参数是self,它表示该类的一个实例

2.普通对象方法至少需要一个self参数,表示类对象实例

3.类方法有类变量cls传入从而可以用cls做一些相关的处理,并且有子类继承是,调用该类方法时,传入的类变量cls是子类而非父类 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。 

4.静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

 

 

二.isinstance 和 issubclass

isinstance(obj,cls)检查object是否是类class的对象

class Foo(object):
     pass
  
obj = Foo()
  
sinstance(obj, Foo)

issubclass(sub,super)检查sub的类是否是super类的派生类

class Foo(object):
    pass
 
class Bar(Foo):
    pass
 
issubclass(Bar, Foo)

三.反射

在Python中一切事物皆对象 ,都可以使用反射。面向对象的反射:通过字符串的形式操作对象相关的属性

两个很重要的方法:hasattr 和 getattr(必须掌握)                 setattr    delattr(了解)

 

class Foo:
    f = 类的静态变量
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print(hi,%s%self.name)

obj=Foo(egon,73)

#检测是否含有某属性
print(hasattr(obj,name))
print(hasattr(obj,say_hi))

#获取属性
n=getattr(obj,name)
print(n)
func=getattr(obj,say_hi)
func()

print(getattr(obj,aaaaaaaa,不存在啊)) #报错

#设置属性
setattr(obj,sb,True)
setattr(obj,show_name,lambda self:self.name+sb)
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,age)
delattr(obj,show_name)
delattr(obj,show_name111)#不存在,则报错

print(obj.__dict__)

四个方法的使用演示

 


以上是关于Python之面向对象进阶------反射(Day26)的主要内容,如果未能解决你的问题,请参考以下文章

Python全栈day26(面向对象进阶)

铁乐学python_day24_面向对象进阶1_内置方法

Python面向对象进阶和socket网络编程-day08

Python之路,Day8 - 面向对象编程进阶

Python--day7--面向对象编程进阶

Python_Day8_面向对象编程进阶