classmethode,staticmethode反射
Posted leiting7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了classmethode,staticmethode反射相关的知识,希望对你有一定的参考价值。
classmethod
和classmethod
classmethod
与staticmethod
都是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)
isinstance
与issuybclass
isinstance
与issuybclass
是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中一切皆对象,都可以使用反射。
反射有四种方法:
hasattr
:hasattr
(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False
getattr
:获取对象的属性或者方法,如果存在则打印出来。hasattr
和getattr
配套使用
需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()
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反射的主要内容,如果未能解决你的问题,请参考以下文章
当我需要在 python 编程中使用@staticmethod 和@classmethod 时? [复制]
@staticmethod与@classmethod的异同点