一、面向对象中特殊方法的补充
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 ...
随机推荐
-
Android-组件RadioButton使用技巧
当初第一次接触Android组件的时候,我感觉微信底部的菜单,是用button这样的组件来做的. 可我想错了.却是用RadioButton来做的.那到底怎么做,接下来我就做一下分享!希望看了之后你也觉 ...
-
python3 报错集合
1.格式 message = "GET / HTTP/1.1\r\n\r\n" s.sendall(message) TypeError: 'str' does not suppo ...
-
显示HTML文本
+ (NSAttributedString*)getAttributedStringFromHtmlString:(NSString*)htmlString{ return [[NSAttribute ...
-
hibernate中多对多关联
hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...
-
Python爬虫【实战篇】bilibili视频弹幕提取
两个重要点 1.获取弹幕的url是以 .xml 结尾 2.弹幕url的所需参数在视频url响应的 javascript 中 先看代码 import requests from lxml import ...
-
69. x 的平方根
问题描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: ...
-
Supervisor的作用与配置
supervisor supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到super ...
-
Centos防火墙设置与端口开放的方法
Centos升级到7之后,内置的防火墙已经从iptables变成了firewalld.所以,端口的开启还是要从两种情况来说明的,即iptables和firewalld.更多关于CentOs防火墙的最新 ...
-
python 字符串格式化,使用f前缀
格式化一般用%,但后来推荐用format format有进步,可以用索引或者名字,但仍然没有很方便和快捷 # logger.debug('{} {} {} {} {} {}'.format(metho ...
-
Python开发【Django】:Model操作(二)
Model操作 1.操作汇总: # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj ...