方法和函数,isinstance/issubclass/type以及反射
2018-09-01 05:54:27来源:博客园 阅读 ()
一丶,isinstance/issubclass/type
1.isinstance检查第一个参数是否是第二个参数的 子子孙孙类
class Foo(): pass class Boo(Foo): pass class Aoo(Boo): pass print(issubclass(Boo,Foo)) #True print(issubclass(Aoo,Foo)) #True
2.type获取当前对象是由那个类创建。
class Foo(object): pass obj = Foo() print(obj,type(obj)) #<__main__.Foo object at 0x000001B58F579D68> <class '__main__.Foo'> if type(obj) == Foo: print('obj是Foo类型') #obj是Foo类型
type练习
class Foo(object): pass class Bar(object): pass def func(*args): foo_counter =0 bar_counter =0 for item in args: if type(item) == Foo: foo_counter += 1 elif type(item) == Bar: bar_counter += 1 return foo_counter,bar_counter result = func(Foo(),Bar(),Foo()) print(result) #(2, 1) v1,v2 = func(Foo(),Bar(),Foo()) print(v1,v2) #2 1
3.isinstance,检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
class Base(object): pass class Foo(Base): pass obj1 = Foo() print(isinstance(obj1,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 obj2 = Base() print(isinstance(obj2,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
二丶方法和函数
称谓:
类,方法
外,函数
到底什么是方法,什么是函数?
对象.xxx ---> xxx就是方法
类.xxx ---> xxx就是函数
xxx ---> xxx就是函数
打印查看:
function
method
代码演示:
from types import MethodType,FunctionType class Foo: def display(self): pass def check(arg): """ 检查arg是方法还是函数? :param arg: :return: """ if isinstance(arg,MethodType): print('arg是一个方法') elif isinstance(arg,FunctionType): print('arg是一个函数') else: print('不知道是什么') check(check) #arg是一个函数 obj = Foo() check(obj.display) #arg是一个方法
三丶反射
1.getattr : 根据字符串的形式,去对象中找成员
class Foo(object): country = "中国" def func(self): pass v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。 print(v) #<function Foo.func at 0x000001E1A557D8C8> obj = Foo() v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。 print(v) #<bound method Foo.func of <__main__.Foo object at 0x000001E1A5579F28>>
2.hasattr : 根据字符串的形式,去判断对象中是否有成员.
a = 123 class Foo(object): country = "中国" def func(self): pass v2 = hasattr(Foo,"a") #判断Foo中是否有a成员 v3 = hasattr(Foo,'country') #判断Foo中是否有country成员 v4 = hasattr(Foo,"func") #判断Foo中是否有func成员 v5 = hasattr(Foo,'xxxxxxx') print(v2,v3,v4,v5) # False True True False
3.setattr : 根据字符串的形式,动态的设置一个成员(内存)
# 根据字符串的形式,动态的设置一个成员(内存) x1 = 123 class Foo: def f1(arg): print(arg,666) setattr(Foo,'x2',999) v1 = getattr(Foo,'x2') print(v1) #999
4.根据字符串的形式,动态的删除一个成员(内存)
x1 = 123 class Foo: def f1(arg): print(arg,666) delattr(Foo,'x1') v9 = getattr(Foo,'x1') print(v9)
应用
class Account(object): func_list = ['login', 'logout', 'register'] def login(self): """ 登录 :return: """ print('登录111') def logout(self): """ 注销 :return: """ print('注销111') def register(self): """ 注册 :return: """ print('注册111') def run(self): """ 主代码 :return: """ print(""" 请输入要执行的功能: 1. 登录 2. 注销 3. 注册 """) choice = int(input('请输入要执行的序号:')) func_name = Account.func_list[choice-1] func = getattr(self, func_name) # self.login func() obj1 = Account() obj1.run() obj2 = Account() obj2.run()
四丶callable 判断是否可以调用
def func(): pass class Foo(object): def __call__(self, *args, **kwargs): pass def func(self): pass obj = Foo() print(callable(func)) print(callable(Foo)) print(callable(obj)) print(callable(obj.func))
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python_字符串方法 2019-08-13
- fetchone函数和fetchall函数返回值的区别 2019-08-13
- Python之装饰器笔记 2019-08-13
- python_公共方法 2019-08-13
- Python学习日记(九) 装饰器函数 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash