zoukankan      html  css  js  c++  java
  • 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中,静态方法和类方法都是可以通过类对象和类对象实例访问,但是区别是:

    1.@classmethod:是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的叫作实例方法,类方法的参数是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__)
    
    四个方法的使用演示
    有一种能力,是持续不断的努力
  • 相关阅读:
    java 深入技术三(List)
    java 深入技术二(Collection)
    java开发JDBC连接数据库详解
    数据库基础和JDBC
    java 深入技术一
    java入门 第三季4
    java入门 第三季3
    04-1. 水仙花数(20)
    04-0. 求符合给定条件的整数集(15)
    03-4. 成绩转换(15)
  • 原文地址:https://www.cnblogs.com/shaojiafeng/p/7375768.html
Copyright © 2011-2022 走看看