classmethode,staticmethode反射

Posted leiting7

tags:

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

classmethodclassmethod

classmethodstaticmethod都是python解释器内置的装饰器

  • classmethod:

? 是一个装饰器,给类内部定义方法的装饰,将类内部的方法变为 “类的绑定方法”。

第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
调用:实例对象和类对象都可以调用。

  • staticmethod

? 翻译: 静态方法 是一个装饰器,给在类内部定义方法中装饰,将类内部的方法变为 “非绑定方法”。

参数随意, 让类里的方法直接被类调用,就像正常调用函数一样

实例对象和类对象都可以调用。

只能通过方法名,类名调用,很硬

- 对象的绑定方法:
    - 由对象来调用,由谁来调用,会将谁(对象)当做第一个参数传入。

- 类的绑定方法:
    - 由类来调用,由谁来调用,会将谁(类)当做第一个参数传入。

- 非绑定方法:
    - 可以由对象或类来调用,谁来调用都是一个普通方法(普通函数),方法需要传入几个参数,就得传入几个。

classmethode

classmethod_Demo:
class DB:
    __data = 'tank is very handsome!!!'

    def __init__(self, user, pwd, role):
        self.user = user
        self.pwd = pwd
        self.role = role

    # @classmethod
    # def init(cls, user, pwd, role):  # cls --》指的是类
    #     # 在类方法内部调用类产生一个实例 ---》 对象
    #     return cls(user, pwd, role)

    # 查看数据方法
    @classmethod
    def check_db(cls, user, pwd, role):  # cls --》指的是类

        # 在类方法内部调用类产生一个实例 ---》 对象
        obj = cls(user, pwd, role)

        # 1.查看数据前,必须要通过校验
        if obj.user == 'tank' and obj.pwd == '123' and obj.role == 'admin':
            print('检验通过..')
            print(cls.__data)
            return cls.__data


DB.check_db('tank', '123', 'admin')

# db_obj = DB('tank', '123', 'admin')
# db_obj.check_db()
# __class__: 查看当前对象的类
# print(db_obj.__class__)

staticmethode

class Foo:
    @staticmethod
    def func(res):
        print(res)

obj = Foo()

# 对象调用非绑定方法
obj.func(123)

# 类调用非绑定方法
Foo.func(1234)

isinstanceissuybclass

isinstanceissuybclass是python内置函数

isinstance: 判断一个对象是否是另一个类的实例。

(传两个参数,一个是对象,一个是类)

? 如果是: True
? 如果不是: False

isinstance:
class Foo:
    pass

class Boo:
    pass

foo_obj = Foo()
boo_obj = Boo()

print(isinstance(foo_obj, Foo))  # True
print(isinstance(boo_obj, Foo))  # False

issubclass: 判断一个类是否是另一个类的子类。

(传两个参数,一个是子类,一个是父类)

? 如果是: True
? 如果不是: False

# issubclass
class Father:
    pass

class Sub(Father):
    pass

class Foo:
    pass

print(issubclass(Sub, Father))  # True
print(issubclass(Foo, Father))  # False

反射

反射:用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射。

反射有四种方法:

hasattrhasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False

getattr:获取对象的属性或者方法,如果存在则打印出来。hasattrgetattr配套使用

    需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()

setattr:给对象的属性赋值,若属性不存在,先创建后赋值

delattr:删除该对象指定的一个属性

hasattr

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

foo_obj = Foo(10)
hasattr
通过字符串x 判断对象中是否有 x属性
print(hasattr(foo_obj, 'x'))  # True
print(hasattr(foo_obj, 'y'))  # False

getattr

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

foo_obj = Foo(10)
getattr
res = getattr(foo_obj, 'x')
print(res)  # 10
若属性不存在,则返回默认值
res = getattr(foo_obj, 'z', '默认值')
print(res)  # 默认值

setattr

#setattr
class Foo:
    def __init__(self, x,):
        self.x = x

foo_obj = Foo(10)
为foo_obj设置一个属性z,值为30
setattr(foo_obj, 'z', 30)
print(hasattr(foo_obj, 'z'))  # True

delattr

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

foo_obj = Foo(10)
delattr
delattr(foo_obj, 'x')
print(hasattr(foo_obj, 'x'))  # False

反射的应用

# 反射应用:
class FileControl:

    def run(self):
        while True:
            # 让用户输入上传或下载功能的命令:
            user_input = input('请输入 上传(upload) 或 下载(download) 功能:').strip()

            # 通过用户输入的字符串判断方法是否存在,然后调用相应的方法
            if hasattr(self, user_input):
                func = getattr(self, user_input)
                func()
            else:
                print('输入有误!')

    def upload(self):
        print('文件正在上传...')

    def download(self):
        print('文件正在下载...')

file_control_obj = FileControl()
file_control_obj.run()

以上是关于classmethode,staticmethode反射的主要内容,如果未能解决你的问题,请参考以下文章

@classmethod和@staticmethod

@staticmethod和@classmethod

当我需要在 python 编程中使用@staticmethod 和@classmethod 时? [复制]

@staticmethod与@classmethod的异同点

python的@classmethod和@staticmethod

Python中的classmethod与staticmethod