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

  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. SQL命令如何分发到集群的各节点

    有些数据库集群的规模是很大的,有上百个节点,那么维护SQL命令如何快速分发给各个节点,例如:要加个字段,逐个节点操作那是十分低效,枯燥的. TreeSoft增加了[SQL分发]功能,简单配置,可以快速 ...

  2. unix系统简明教程 命令

    who                                 显示电脑用户信息 liu :0 Oct 6 13:17 (:0)liu pts/2 Oct 6 13:22 (:0) who a ...

  3. flask 编码问题

    在我们的flask项目中,通过表单提交对数据库进行更新的时候,数据提交不成功,提示以下内容: sqlalchemy.exc.InternalError: (pymysql.err.InternalEr ...

  4. zero copy图解

    原文链接:https://www.jianshu.com/p/8c6b056f73ce 1 传统的IO读写 传统的IO读写有两种方式:IO终端和DMA.他们各自的原理如下. 1.1 IO中断原理   ...

  5. 小程序里实现 watch 和 computed

    小程序里的自定义组件里是有数据监听器的,可以监听对应数据的变化来执行callBack,但是页面Page里没有对应的api就显的很生硬,比如某个数据变了(如切换城市)需要重新刷页面,如果不做监听,每次都 ...

  6. 线性链条件随机场(CRF)的原理与实现

    基本原理 损失函数 (线性链)CRF通常用于序列标注任务,对于输入序列\(x\)和标签序列\(y\),定义匹配分数: \[ s(x,y) = \sum_{i=0}^l T(y_i, y_{i+1}) ...

  7. ABP中的本地化处理(下)

    在上篇文章中我们的重点是讲述怎样通过在Domain层通过PreInitialize()配置ILocalizationConfiguration中的Sources(IList<ILocalizat ...

  8. 数组模拟循环队列(java实现)

    1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...

  9. 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS

    作者: yoyoso https://my.oschina.net/ioslighter/blog/359207 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 看 ...

  10. google test 打印派生类对象

    在Unison中使用google test时,发现EXPECT_EQ在fail时,不能打印Unison Test Language中定义的派生类的对象.于是写了个纯C++的示例,发现在只定义基类的op ...