类和对象的方法

一、绑定方法和非绑定方法

类中定义的函数分为两大类:绑定方法和非绑定方法

  • 绑定方法:分为绑定到类和对象的方法,绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入

    • 绑定到对象的方法:在类内定义的没有被任何装饰器修饰的

    • 绑定到类的方法:在类内定义的被装饰器classmethod修饰的方法

  • 非绑定方法没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用

    • 非绑定方法:为类中某个函数加上装饰器@staticmethod,不与类或者对象绑定
    class Foo:
        def __init__(self, name):
            self.name = name
    
        def tell(self):
            print('名字是%s' % self.name)
    
        @classmethod
        def func(cls):  # cls=Foo
            print(cls)
    
        @staticmethod
        def func1(x, y):
            print(x + y)
    
    
    # 实例对象调用对象的绑定方法
    f = Foo('tester')  # 名字是tester
    f.tell()  # 3
    # 实例对象调用静态方法(非绑定方法)
    f.func1(1, 2)
    # 实例的对象调用类方法
    f.func()  # <class '__main__.Foo'>
    
    # 类调用类方法(绑定方法)
    Foo.func()  # <class '__main__.Foo'>
    # 类调用静态方法
    Foo.func1(2, 3)  # 5
    

二、类里面的装饰器

  • @staticmethod ,把类里面的函数设置为静态方法,即为非绑定发放

  • @classmethod,被装饰的方法设置为类方法,类方法的第一个参数指向类对象自己

  • @property,把方法当成属性一样去使用

    class People:
        def __init__(self, name):
            self.__name = name
    
        @property
        def name(self):
            # print('getter')
            return self.__name
    
        @name.setter
        def name(self, val):
            # print('setter',val)
            if not isinstance(val, str):
                print('名字必须是字符串类型')
                return
            self.__name = val
    
        @name.deleter
        def name(self):
            print('deleter')
            print('不允许删除')
    
    
    p = People('tester')
    p.name = 'aa'
    print(p.name)  # aa
    del p.name
    

三 、反射

python是动态语言,而反射(reflection)机制被视为动态语言的关键。反射机制指的是在程序的运行状态中

  • 对于任意一个类,都可以知道这个类的所有属性和方法;

  • 对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制。

反射的核心本质就是以字符串的形式去导入一个模块,利用字符串的形式去执行函数。

反射:通过字符串映射到对象的属性、方法、模块

反射的应用

class Service:
    def run(self):
        while True:
            inp = input('>>: ').strip()  # cmd='get a.txt'
            cmds = inp.split()  # cmds=['get','a.txt']

            # print(cmds)
            if hasattr(self, cmds[0]):
                func = getattr(self, cmds[0])
                func(cmds)

    def get(self, cmds):
        print('get.......', cmds)

    def put(self, cmds):
        print('put.......', cmds)


obj = Service()
obj.run()

hasattr(object,name)

判断object中有没有一个name字符串对应的方法或属性

getattr(object, name, default=None)

def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value

    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass

setattr(x, y, v)

def setattr(x, y, v): # real signature unknown; restored from __doc__
    """
    Sets the named attribute on the given object to the specified value.

    setattr(x, 'y', v) is equivalent to ``x.y = v''
    """
    pass

delattr(x, y)

def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.

    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass
posted @ 2021-02-01 20:09  深圳-逸遥  阅读(105)  评论(0编辑  收藏  举报