绑定与非绑定方法及反射,isinstance和issubclass内置函数
绑定方法与非绑定方法
1.绑定方法
绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数传入
绑定给对象的方法:
类中定义的函数默认就是绑定给对象的
绑定给类的方法:
为类中定义的函数加上一个装饰器classmethod
2.非绑定方法(staticmethod)
非绑定方法: 既不与类绑定,又不与对象绑定,意味着对象和类都可以来调用,无 论谁来调用都是一个普通的函数,没有自动传值的效果;为类中定义的函数加上一个装 饰器staticmethod。
示例
class Foo:
def f1(self):
print(self)
@classmethod
def f2(cls):
print(cls) # <class '__main__.Foo'>
@staticmethod
def f3(x,y):
print('f3',x+y)
obj=Foo()
print(Foo.f1) # 就是一个普通函数 <function Foo.f1 at 0x0000000002965620>
print(obj.f1) # 对象绑定方法 <bound method Foo.f1 of <__main__.Foo object at 0x0000000009F83C88>>
obj.f1() # <__main__.Foo object at 0x0000000009F83C88>
print(Foo.f2) # 类绑定方法 <bound method Foo.f2 of <class '__main__.Foo'>>
Foo.f2()
print(obj.f2) # <bound method Foo.f2 of <class '__main__.Foo'>>
obj.f2()
print(Foo.f3) # <function Foo.f3 at 0x0000000009FF4F28>
print(obj.f3) # <function Foo.f3 at 0x0000000009FF4F28>
Foo.f3(1,2) # f3 3
obj.f3(3,4) # f3 7
应用
# settings.py
ip='127.0.o.1'
port='3306'
# 当前文件
import settings
class MySql:
def __init__(self, ip, port):
self.id = self.create_id()
self.ip = ip
self.port = port
def tell_info(self):
print('<id:%s ip:%s port:%s>' % (self.id, self.ip, self.port))
@classmethod
def from_conf(cls):
return cls(settings.IP, settings.PORT)
@staticmethod
def create_id():
import uuid
return uuid.uuid4()
# obj1=MySql('1.1.1.1',3306)
# obj1.tell_info() # <id:9b13ad59-10e0-4b65-af15-b5d7d97034e1 ip:1.1.1.1 port:3306>
obj2 = MySql.from_conf()
obj2.tell_info()
isinstance和issubclass 内置函数
1.isinstance
判断一个对象是否是一个类的实例。
isinstance(参数1,参数2):用于判断参数1是否是参数2的一个实例。
isinstance(对象,类)
2.issubclass
判断一个类是否是另一个类的子类
issubclass(参数1, 参数2):用与判断参数1是否是参数2的子类。
print(isinstance(10,int)) # True
class Foo:
pass
class Goo(Foo):
pass
foo_obj = Foo()
print(isinstance(foo_obj, Foo)) # True
print(isinstance(foo_obj, Goo)) # False
print(issubclass(Goo, Foo)) # True
foo_obj = Goo()
print(isinstance(foo_obj, Goo)) # True
print(isinstance(foo_obj, Foo)) # True
反射(面向对象高阶)
反射定义
反射就是反省,自省的意思,指的是一个对象应该具备,可以检测,修改,增加自身属性的能力 ;通过字符串的形式操作对象相关的属性。
4个可以实现反省的函数(内置函数)
hasattr (参数1(对象),参数2) 判断某个对象是否存在某个属性;
getattr(参数1(对象),参数2,参数3) 从参数1中取出某个属性,第三个参数是默认 值,当属性不存在时,没有第三个参数报错,有的话,返回第三个参数;
setattr(参数1(对象),参数2(属性),参数3(属性值)),为对象添加新的属性
delattr(参数1(对象),参数2(属性名)):从对象中删除属性;
class People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
p = People('tank', 17, 'male')
# 普通方式
print('name' in p.__dict__) # True
print('country' in People.__dict__) # True
print('country2' in People.__dict__) # False
# hasattr
print(hasattr(p, 'name')) # True
print(hasattr(People, 'country')) # True
# 普通方式
print(p.__dict__.get('name')) # tank
print(p.__dict__.get('level', '9')) # 9
# getattr
print(getattr(p, 'name', 'jason_sb')) # tank
print(getattr(p, 'name1', 'jason_sb')) # jason_sb
print(getattr(People, 'country2', 'China'))
# setattr
# 普通
p.level = 10
print(p.__dict__) # {'name': 'tank', 'age': 17, 'sex': 'male', 'level': 10}
# 反射
setattr(p, 'sal', '3.0')
print(hasattr(p, 'sal')) # True
print(p.__dict__) # {'name': 'tank', 'age': 17, 'sex': 'male', 'level': 10, 'sal': '3.0'}
# delattr
# 普通
del p.level
print(hasattr(p, 'level')) # False
# 反射
delattr(p, 'sal')
print(hasattr(p, 'sal')) # False
反射小练习
class Movie:
def input_cmd(self):
print('输入命令:')
while True:
cmd = input('请输入执行的方法名:').strip()
# 若用户输入的cmd命令是当前对象的属性
if hasattr(self, cmd):
# if cmd in self.__class__.__dict__:
method = getattr(self, cmd)
method()
else:
print('命令错误,请重新输入!')
def upload(self):
print('电影开始上传...')
def download(self):
print('电影开始下载...')
movie_obj = Movie()
movie_obj.input_cmd()
反射使用场景
反射其实就是对属性的增删改查,但是如果直接使用内置的__dict__来操作,语法繁琐,不好理解
另外一个最主要的问题是,如果对象不是我自己写的是另一方提供的,我就必须判断这个对 象是否满足要求,是否是我需要的属性和方法
应用:一般用在框架设计,反射被称为框架的基石;因为框架的设计者,不可能提前知道 你的对象到底是怎么设计的,所以你提供给框架的对象,必须通过判断验证之后才能正常 使用,判断验证就是反射要做的事情,当然通过__dict__也是可以实现的, 其实这些方法也就是对 __dict__的操作进行了封装
反射动态导入示例
'''
需求:要实现一个用于处理用户的终端指令的小框架
框架就是已经实现了最基础的构架,就是所有项目都一样的部分
'''
# libs.plugins.py # libs文件夹下的plugins文件
# 插件部分
class WinCMD:
def cd(self):
print("wincmd 切换目录....")
def delete(self):
print("wincmd 要不要删库跑路?")
def dir(self):
print("wincmd 列出所有文件....")
class LinuxCMD:
def cd(self):
print("Linuxcmd 切换目录....")
def rm(self):
print("Linuxcmd 要不要删库跑路?")
def ls(self):
print("Linuxcmd 列出所有文件....")
# settings.py 文件
'''作为框架的配置文件'''
# 作为框架使用者,在配置文件中指定你配合框架的类是哪个框架的使用者提供一个配置文件,要求对方将类的信息写入配置文件,然后框架自己去加载需要的模块
class_path = 'libs.plugins.WinCMD' # libs是plugins.py文件所在的文件夹
# myframework.py 文件
#框架的设计者
import importlib
import settings
# 框架已经实现的部分
def run(plugin):
while True:
cmd = input("请输入指令:")
if cmd == "exit":
break
# 因为无法确定框架使用者是否传入正确的对象所以需要使用反射来检测
# 判断对象是否具备处理这个指令的方法
if hasattr(plugin,cmd):
# 取出对应方法方法
func = getattr(plugin,cmd)
func() # 执行方法处理指令
else:
print("该指令不受支持...")
print("see you la la!")
# 创建一个插件对象 调用框架来使用它
# wincmd = plugins.WinCMD()
# 框架之外的部分就有自定义对象来完成
# 框架得根据配置文件拿到需要的类
path = settings.CLASS_PATH
# 从配置中单独拿出来 模块路径和 类名称
module_path,class_name = path.rsplit(".",1) # libs.plugins,WinCMD
#拿到模块
mk = importlib.import_module(module_path)
# 拿到类
cls = getattr(mk,class_name)
# 实例化对象
obj = cls()
#调用框架
run(obj)
绑定与非绑定方法及反射,isinstance和issubclass内置函数的更多相关文章
- python基础之 反射,md5加密 以及isinstance, type, issubclass内置方法的运用
内容梗概: 1. isinstance, type, issubclass 2. 区分函数和方法 3. 反射(重点) 4. md5加密 1. isinstance, type, issubclass1 ...
- Python学习日记(二十七) 反射和几个内置函数
isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...
- 面向对象之反射 与__str__等内置函数
一 反射 1.面向对象中的反射:通过字符串的形式操作对象的相关属性,python中一切事物都是属性(都可以使用反射) 四个可以实现自省<反射>的函数:hasattr / getattr ...
- 字典内置函数&方法
字典内置函数&方法 Python字典包含了以下内置函数:高佣联盟 www.cgewang.com 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dic ...
- python面向编程;类的绑定与非绑定方法、反射、内置方法
一.类的绑定与非绑定方法 ''' 类中定义函数分为了两大类: 1. 绑定方法 特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何 ...
- python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法
一.内置函数补充 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstan ...
- javascript内置函数提供的显式绑定
内置函数提供的显式绑定 最近在开发中遇到使用arr.map(module.fun) 这样的写法时(在一个模块调用了另外一个模块的方法), 造成了函数中this丢失的问题, 显示为undefined, ...
- python---issubclass/type/isinstance/ 反射(内置函数getattr/delattr...)
# 一 python面向对象-内置函数(issubclass(), type(), isinstance()) # issubclass 判断xxxx类是否是xxxx类的子类 class egg: p ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
随机推荐
- svn修改代码URL整合路径
我们平常开发的代码都是在A服务器上整合的,最近A服务器突然无法访问了,所以今天我们更换了一下服务器.svn如何安装的就不说了,这里只介绍一下如何更换SVN URL的. 在你拿到URL后,在工作文件夹下 ...
- filebeat的层次架构图和配置部署 -- 不错的文档 - elasticsearch 性能调优 + Filebeat配置
1.fielbeat的组件架构-看出层次感 2.工作流程:每个harvester读取新的内容一个日志文件,新的日志数据发送到spooler(后台处理程序),它汇集的事件和聚合数据发送到你已经配置了Fi ...
- Chcp,Chdir(Cd),Chkdsk和Chkntfs
Chdir(缩写为cd)(全称猜测是change drive):显示或更改当前目录的名称; 注c:a/b\c/d 表示C盘下的a的b的c的d,目录可用' / '(正斜)或 ' \ '(反斜),参数只能 ...
- [转]C#集合类型大揭秘
作者:撸码那些事 来源:https://www.cnblogs.com/songwenjie/p/9185790.html 集合是.NET FCL(Framework Class Library)的重 ...
- 解决WordPress百度分享图标不显示问题
最近在帮朋友维护博客时,发现他的百度分享居然不能使用了,首先很多人会认为,百度分享挂在那里就是一种摆设,又没有几个人去分享,有什么含义呢?其实挂百度分享的含义是非常重要的,网站增加一个百度分享是可以增 ...
- golang substring
在java下习惯了String.subString(start,end) 然后再golang继续敲substring木有了,看了下代码,也是原生支持的 但是百度发现有些人竟然把字符串转成字符数组再根据 ...
- sql server len函数
len函数 --返回字符表达式中的字符数 --如果字符串中包含前导空格和尾随空格,则函数将它们包含在内 --LEN对相同的单字节和双字节字符串返回相同的值 --示例:select LEN('no'), ...
- delegate作为操作符的使用
lambda表达式的出现基本上取代了delegate操作符的使用 public MainWindow() { InitializeComponent(); this.button1.Click += ...
- MySQL数据库基础-JAVA
数据库 MySQL初步 MySQL基础认知 (Oracle真的是走哪祸害到哪23333) Java多用MySQL和Oracle SQLServer也收费,但是还行,比Oracle便宜,一个差不多3w多 ...
- avascript中实现垃圾桶的功能
javascript中实现垃圾桶的功能,就像折垃圾桶在拖动目标上触发事件 (源元素):ondragstart - 用户开始拖动元素时触发ondrag - 元素正在拖动时触发ondragend - 用户 ...