面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射
一、面向对象中特殊方法的补充
1.__str__ 能将对象名改成你想要的字符串,但是类型还是类
class Foo(object):
def __init__(self):
pass
def func(self):
pass
def __str__(self):
return "f1"
obj = Foo()
print(obj,type(obj))
# f1 <class '__main__.Foo'>
2.__doc__ 能将类的注释文档显示出来
class Foo(object):
'''
asdqwe
'''
def __init__(self):
pass def func(self):
pass
obj = Foo()
print(obj.__doc__)
# asdqwe
3.__dict__ 能将对象中封装的数据以字典的形式输出
class Foo(object):
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
pass
obj1 = Foo("a1",14)
obj2 = Foo("a2",15)
print(obj1.__dict__) #{'name': 'a1', 'age': 14}
print(obj2.__dict__) #{'name': 'a2', 'age': 15}
4.__iter__
如果想要把不可迭代对象转变成可迭代对象:
1.在类中定义__iter__方法
2.iter内部返回一个迭代器(生成器也是一种特殊迭代器)
class Foo(object):
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
pass
def __iter__(self):
return iter([11,22,33,44])
obj = Foo("a1",13)
for el in obj:
print(el)
#
#
#
#
几个实例:
class StarkConfig(object):
list_display = [] def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display class RoleConfig(StarkConfig):
list_display = [11,22] s1 = StarkConfig() result1 = s1.get_list_display()
print(result1) # [33] result2 = s1.get_list_display()
print(result2) # [33,33]
class StarkConfig(object):
def __init__(self):
self.list_display = [] def get_list_display(self):
self.list_display.insert(0, 33)
return self.list_display class RoleConfig(StarkConfig):
list_display = [11, 22] s1 = StarkConfig() result1 = s1.get_list_display()
print(result1) # [33] result2 = s1.get_list_display()
print(result2) # [33, 33]
二、sinstance/issubclass/type三种方法
1.issubclass #检查第一个参数是否是第二个参数的子类或子孙类
class Base(object):
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(issubclass(Bar,Base))
print(issubclass(Foo,Base))
# True
# True
2.type #获取当前对象是由哪个类创建的
class Foo(object):
pass obj = Foo() print(obj, type(obj)) # 获取当前对象是由那个类创建。
if type(obj) == Foo:
print('obj是Foo类型')
# obj是Foo类型
练习题
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) v1, v2 = func(Foo(), Bar(), Foo()) #解构
print(v1, v2)
3.isinstance 判断第一个参数(对象),是否是第二个参数(类及父类)的实例
class Bar(object):
pass
class Base(Bar):
pass
class Foo(Base):
pass
obj1 = Foo()
print(isinstance(obj1,Foo))
print(isinstance(obj1,Base))
print(isinstance(obj1,Bar))
# True
# True
# True
**type:判断对象是不是由某一个指定类 type(obj)==Foo
**isinstance:判断对象是不是由某一个指定类或其父类 isinstance(obj,Foo)
三、判断是方法还是函数
称谓:类,方法
外,函数
对象.xxx---->xxx就是方法
类.xxx ----->xxx就是函数
xxx ------>xxx就是函数
代码判断:
from types import FunctionType,MethodType
def check(arg):
"""
检查arg是函数还是方法
:param arg:
:return:
"""
if isinstance(arg,FunctionType):
print("arg是一个函数")
elif isinstance(arg,MethodType):
print("arg是一个方法")
else:
print("arg什么都不是")
class Foo():
def f1(self):
pass
obj = Foo()
check(obj.f1) #arg是一个方法
check(Foo.f1) #arg是一个函数
四、反射
getattr 根据字符串的形式,去对象中找成员 v = getattr(obj,"func")
hasattr 根据字符串的形式,去判断对象中是否有成员
setattr 根据字符串的形式,动态的设置一个成员(内存)
delattr 根据字符串的形式,动态的删除一个成员(内存)
from types import FunctionType
import handler while True:
print("""
系统支持的函数有:
1. f1
2. f2
3. f3
4. f4
5. f5
""")
val = input("请输入要执行的函数:") # val = "f1" # 错误
# handler.val()
if hasattr(handler, val):
func_or_val = getattr(handler, val) # 根据字符串为参数,去模块中寻找与之同名的成员。
if isinstance(func_or_val, FunctionType):
func_or_val()
else:
print(func_or_val)
else:
print('handler中不存在输入的属性名')
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(Account,func_name) # Account.login
# func(self) func = getattr(self, func_name) # self.login
func() obj1 = Account()
obj1.run() obj2 = Account()
obj2.run()
面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射的更多相关文章
- 方法和函数,isinstance/issubclass/type以及反射
一丶,isinstance/issubclass/type 1.issubclass检查第一个参数是否是第二个参数的 子子孙孙类 class Foo(): pass class Boo(Foo): p ...
- python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类
isinstance 是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass 是python 中的内置函数, 用来一个类A是不是另外一个 ...
- isinstance/issubclass/type的区别?
type() 判断某个对象是否是该类创建的,只看一层,如果是继承类,也不会考虑继承类的类型.. Issubclass() 判断该类是否是另一个类的派生类,也就是子类,参数为类. isinstance( ...
- day 25 方法和函数 反射
特殊成员的补充: # __str__ class Foo(object): def __init__(self): pass def func(self): pass def __str__(self ...
- issubclass/type/isinstance、函数和方法、反射、callable、特殊成员补充
一.issubclass/type/isinstance(***) 1.issubclass(参数1, 参数2):检查第一个参数是否是第二个参数的 子子孙孙类,如下示例: class Base(obj ...
- day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()
__str__()__repr__()__len__() str() 转字符串repr() 让字符原形毕露的方法len() 计算长度 内置的方法很多,但是并不是全部都在object中,比如len(), ...
- python基础-9.1 面向对象进阶 super 类对象成员 类属性 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理
上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...
- Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass
Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...
- python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass
https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...
随机推荐
- IOPS 测试工具 FIO
FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎. fio-2.8下载: wget http://brick.kernel.dk/snaps/fio-2.8 ...
- js 次方 开方 对数
次方 ,用Math.pow(值,次方数) 如: Math.pow(3,2); 3的平方 Math.Pow(2,3); 2的立方 开方Math.sqrt(值) 如: Math.sqrt(9); ...
- [bzoj5483][Usaco2018 Dec]Balance Beam_凸包_概率期望
bzoj5483 Usaco2018Dec Balance Beam 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=5483 数据范围:略. 题解 ...
- [Xamarin] - Xamarin.Forms Project with .Net Standard 2.0
1. Install .NET Core 2.0 SDK .https://www.microsoft.com/net/download/core 2. Install Android 7.1 (AP ...
- [Nuget] - "Runtime error: Could not load file or assembly 'System.Web.WebPages.Razor, Version=3.0.0.0'" 问题之解决
环境 项目中使用了 System.Web.WebPages.Razor, Version=3.0.0.0,Nuget 还原缺失包后自动更新至 Version=3.2.5.0,编译成功,运行失败. 错误 ...
- SSM整合-配置文件
使用工具:maven.idea.jdk8.mysql.tomcat9.0 初学ssm框架,配置文件的配置目录: 其中genera ...
- zblog安装环境介绍?zblog安装需要什么环境
最近在群里看到很的多人有在问:“安装zblog需要什么环境?”,其实这个问题在zblog官网的程序下载页面有说明,但是不太详细,那么本文的目的就是来给大家介绍下zblog安装环境详细说明. zblog ...
- 利用Python进行数据分析 第7章 数据清洗和准备(2)
7.3 字符串操作 pandas加强了Python的字符串和文本处理功能,使得能够对整组数据应用字符串表达式和正则表达式,且能够处理烦人的缺失数据. 7.3.1 字符串对象方法 对于许多字符串处理和脚 ...
- go语言实现链式栈
haa哈哈== import "errors" var ( // ErrEmpty 栈为空 ErrEmpty = errors.New("stack is empty&q ...
- JAVA实现种子填充算法
种子填充算法原理在网上很多地方都能找到,这篇是继上篇扫描线算法后另一种填充算法,直接上实现代码啦0.0 我的实现只是实现了种子填充算法,但是运行效率不快,如果大佬有改进方法,欢迎和我交流,谢谢! 最后 ...