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()