面向对象中特殊方法的补充、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 ...
随机推荐
- MySQL索引对NULL值的处理
# 索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的.所以我们在数据库设计时不要让字段的默认值为NU ...
- 基于libuv的TCP设计(二)
一.本人设想的TCP服务器有如下特性: 1.启动服务,一直监听端口. 2.有新连接(客户端)就通知用户.并把连接接收到的数据回调给用户. 3.客户端连接上后用户可在任意时间发送数据给它. 4.客户端断 ...
- 使用第三方Java类库jaudiotagger完成Flac音频文件metadata(元数据)的读和修改
最近需要使用Java Swing做个读写Flac格式音频文件的小GUI工具,虽然Mp3tag完全可以完成Flac的读写(编辑)任务,但是为了简化工作流程(编辑Flac信息后调用其它系统的接口完成部分信 ...
- 上传大文件到腾讯云cos遇到的一些问题
讲一个开发遇到的问题. 开发中遇到一个需求,需要在后台表单页面支持上传视频.因为项目中一直用的是腾讯云的COS做第三方存储平台,所以视频也要上传到cos中保存.首先想到的是使用腾讯提供的php的SDK ...
- springboot集成kaptcha验证码
在pom.xml引入依赖 <!-- 验证码 --> <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptch ...
- SUPPA 可变剪切分析
SUPPA是一款通过转录本定量来获取可变剪切定量结果的软件.转录本的定量方式有很多,例如count,FPKM, TPM等,作者建议使用TPM,因为先均一化了基因的长度,然后均一化了测序的深度.同时 ...
- java当中JDBC当中的transaction例子
[学习笔记] 7.jdbc的transaction例子: import java.sql.*; public class MySQlTransaction1 { public static void ...
- 使用Lombok总结
Lombok学习总结 Project Lombok is a java library that automatically plugs into your editor and build tool ...
- opencv模块学习
一.简介 ''' 分辨率(resolution,港台称之为解析度)就是屏幕图像的精密度,是指显示器所能显示的像素的多少.由于屏幕上的点.线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同 ...
- k8s开发实践
代码自动生成:https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/ 自定义controlle ...