zoukankan      html  css  js  c++  java
  • day27_面向对象的进阶

    Classmothod

    classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

    class Classmethod_Demo():
        role = 'dog'
    
        @classmethod
        def func(cls):
            print(cls.role)
    
    Classmethod_Demo.func()

    staticmethod

    python staticmethod 返回函数的静态方法。

    该方法不强制要求传递参数,如下声明一个静态方法:

    class Staticmethod_Demo():
        role = 'dog'
    
        @staticmethod
        def func():
            print("当普通方法用")
    
    Staticmethod_Demo.func()

    Python中classmethod与staticmethod区别

    classmethod:类方法
    staticmethod:静态方法

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

        • @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。 
        • 普通对象方法至少需要一个self参数,代表类对象实例
        • 类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。 
        • 静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少
        • 如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
        • @classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

    isinstance和issubclass

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

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

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

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

    hasattr()、getattr()、setattr() , delattr函数的使用

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

    四个可以实现自省的函数

    下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 

    1. hasattr(object, name)

      判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法;有则返回True,没有则返回False;需要注意的是name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参;getattr和setattr也同样;

    >>> class A():
        name = 'python'
        def func(self):
            return 'A()类的方法func()'
    
        
    >>> 
    >>> hasattr(A, 'name')
    True
    >>> 
    >>> hasattr(A, 'age')
    False
    >>> 
    >>> hasattr(A, 'func')
    True

    2. getattr(object, name[, default])

      获取object对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况,一种是没有default参数时,会直接报错;给定了default参数,若对象本身没有name属性,则会返回给定的default值;如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();

      另外还需要注意,如果给定的方法func()是实例函数,则不能写getattr(A, 'func')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), 'func')();实例函数和类函数的区别可以简单的理解一下,实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;

    >>> class A():
        name = 'python'
        def func(self):
            return 'Hello world'
    
        
    >>> 
    >>> getattr(A, 'name')
    'python'
    >>> 
    >>> getattr(A, 'age')    # age变量不存在则报错
    
    Traceback (most recent call last):
      File "<pyshell#464>", line 1, in <module>
        getattr(A, 'age')
    AttributeError: class A has no attribute 'age'
    >>> 
    >>> getattr(A, 'age', 20)
    20
    >>> 
    >>> getattr(A, 'func')
    <unbound method A.func>
    >>> 
    >>> getattr(A, 'func')()    # func()函数不能被A类对象调用,所以报错
    
    Traceback (most recent call last):
      File "<pyshell#470>", line 1, in <module>
        getattr(A, 'func')()
    TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
    >>> 
    >>> getattr(A(), 'func')()
    'Hello world'
    >>> 
     
    >>> class A(object):
        name = 'python'
        @classmethod
        def func(cls):
          return 'the method of A object.'
    
    >>> 
    >>> getattr(A, 'func')()
    'the method of A object.'
    >>>

    3. setattr(object, name, value)

      给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value;

    >>> class A():
        name = 'python'
        def func(self):
            return 'Hello world'
    
        
    >>> 
    >>> setattr(A, 'name', 'java')
    >>> getattr(A, 'name')
    'java'
    >>> 
    >>> setattr(A, 'age', 20)
    >>> getattr(A, 'age')
    20

    一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值;很简单的if-else判断:

    >>> class A():
        name = 'python'
        def func(self):
            return 'Hello world'
    
        
    >>> 
    >>> if hasattr(A, 'age'):
        print getattr(A, 'age')
    else:
        setattr(A, 'age', 20)
    
        
    >>> 
    >>> getattr(A, 'age')
    20

     4.delattr(object,name)

    #删除属性
    delattr(obj,'age')
    delattr(obj,'show_name')
    delattr(obj,'show_name111')#不存在,则报错
    
    print(obj.__dict__)
  • 相关阅读:
    服务器中一个进程kill不掉,如何处理?
    JVM基本概念
    Redis安装以及常见问题
    JVM---类加载器
    lambda表达式
    maven学习(3)pom.xml文件说明以及常用指令
    maven学习(2)仓库和配置
    maven学习(1)下载和安装和初步使用(手动构建项目和自动构建项目)
    JMicro微服务之超时&重试
    JMicro微服务Hello World
  • 原文地址:https://www.cnblogs.com/wzc27229/p/11171284.html
Copyright © 2011-2022 走看看