一、面向对象中特殊方法的补充

  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()
callable  判断是否能被调用

面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射的更多相关文章

  1. 方法和函数,isinstance/issubclass/type以及反射

    一丶,isinstance/issubclass/type 1.issubclass检查第一个参数是否是第二个参数的 子子孙孙类 class Foo(): pass class Boo(Foo): p ...

  2. python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类

    isinstance   是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass  是python 中的内置函数,  用来一个类A是不是另外一个 ...

  3. isinstance/issubclass/type的区别?

    type() 判断某个对象是否是该类创建的,只看一层,如果是继承类,也不会考虑继承类的类型.. Issubclass() 判断该类是否是另一个类的派生类,也就是子类,参数为类. isinstance( ...

  4. day 25 方法和函数 反射

    特殊成员的补充: # __str__ class Foo(object): def __init__(self): pass def func(self): pass def __str__(self ...

  5. issubclass/type/isinstance、函数和方法、反射、callable、特殊成员补充

    一.issubclass/type/isinstance(***) 1.issubclass(参数1, 参数2):检查第一个参数是否是第二个参数的 子子孙孙类,如下示例: class Base(obj ...

  6. day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()

    __str__()__repr__()__len__() str() 转字符串repr() 让字符原形毕露的方法len() 计算长度 内置的方法很多,但是并不是全部都在object中,比如len(), ...

  7. python基础-9.1 面向对象进阶 super 类对象成员 类属性 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

    上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...

  8. Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass

    Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...

  9. python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass

    https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...

随机推荐

  1. Swoole练习 websocket

    WEBSOCKET 服务端代码 //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0& ...

  2. Mac下安装VirtualBox并在VirtualBox中安装CentOS7

    VirtualBox (百科)VirtualBox 是一款开源虚拟机软件.VirtualBox 是由德国 Innotek 公司开发,由Sun Microsystems公司Sun Microsystem ...

  3. jira常用配置

    1.关闭注册入口 系统->一般配置->运行模式:私有 2.分享给用户组是,看不到部分用户组的时候,只需要把你的账号添加该分组即可. 3.为项目分配权限,问题-->问题属性——> ...

  4. ATT&CK框架学习

     ATT&CK模型 ATT&CK是分析攻击者行为(即TTPs)的威胁分析框架.ATT&CK框架核心就是以矩阵形式展现的TTPs,即Tactics, Techniques and ...

  5. Google BERT

    概述 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不 ...

  6. LC 297 Serialize and Deserialize Binary Tree

    问题: Serialize and Deserialize Binary Tree 描述: Serialization is the process of converting a data stru ...

  7. 算法两数之和 python版

    方法一.暴力解法 -- 5s 复杂度分析:时间复杂度:O(n^2)空间复杂度:O(1) length = len(nums)for i in range(length):    for j in ra ...

  8. PAT甲级题分类汇编——树

    本文为PAT甲级分类汇编系列文章. AVL树好难!(其实还好啦~) 我本来想着今天应该做不完树了,没想到电脑里有一份讲义,PPT和源代码都有,就一遍复习一遍抄码了一遍,更没想到的是编译一遍通过,再没想 ...

  9. c++ (1) c++ 与c 的区别

    可以说c++ 语言在c基础上扩展了许多  在学习玩c语言之后  学习c++ 会发现容易一些  但是c++也有优越于c 的地方 c++ 与c 语言都属于本地编译型语言 ,直接编译成本地编译码,运行特别快 ...

  10. LINUX驱动笔记 目录

    笔记参考了宋宝华老师的<Linux设备驱动开发详解:基于最新的Linux 4.0内核>以及韦东山老师的嵌入式驱动教程 笔记开发环境: 单板:第一章到第八章使用TINY4412-1611:第 ...