特殊成员的补充:
# __str__
class Foo(object):
def __init__(self):
pass
def func(self):
pass
def __str__(self):
return "F1" #返回的结果必须是字符串,别的都不行
obj = Foo()
print(obj,type(obj))
#### __doc__
class Foo(object):
"""
asdfasdfasdfasdf
"""
def __init__(self):
pass
def func(self):
pass
obj = Foo()
print(obj.__doc__) #打印注释里面的内容
## __dict__
class Foo(object):
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
pass
obj1 = Foo('刘博文',99)
obj2 = Foo('史雷',89)
print(obj1.__dict__) # {'name': '刘博文', 'age': 99}
print(obj2.__dict__) # {'name': '史雷', 'age': 89}
### __iter__
# l1是list类的一个对象,可迭代对象
l1 = [11,22,33,44]
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,55,66])
yield 11
yield 22
yield 33
# obj1是Foo类的一个对象,可迭代对象
"""
如果想要把不可迭代对象 -> 可迭代对象
1. 在类中定义__iter__方法
2. iter内部返回一个迭代器(生成器也是一种特殊迭代器)
"""
obj1 = Foo('刘博文',99)
for item in obj1:
print(item)
今日内容:
1. isinstance/issubclass/type
2. 方法和函数
3. 反射
1、issubclass issubclass(Bar,Base)检查第一个参数是否是第二个参数的 子子孙孙类

issubclass
class Base(object):
pass
class Foo(Base):
pass
class Bar(Foo):
pass
print(issubclass(Bar,Base)) # 检查第一个参数是否是第二个参数的 子子孙孙类
2、type:获取当前对象是由那个类创建。

"""
class Foo(object):
pass
obj = Foo()
print(obj,type(obj)) # 获取当前对象是由那个类创建。
if type(obj) == Foo:
print('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,检查第一个参数(对象)是否是第二个参数(类及父类)的实例

1 class Base(object): 2 pass 3 4 class Foo(Base): 5 pass 6 7 obj1 = Foo() 8 print(isinstance(obj1,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 9 print(isinstance(obj1,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 10 11 12 obj2 = Base() 13 print(isinstance(obj2,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 14 print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。 15 16 17 18 # #################### 练习 19 """ 20 给你一个参数,判断对象是不是由某一个指定类? type --> type(obj) == Foo 21 给你一个参数,判断对象是不是由某一个指定类或其父类? isinstance --> instance(obj,Foo)
2. 方法和函数
称谓:
类,方法
外,函数
到底方法函数?
对象.xxx --> xxx就是方法
类.xxx --> xxx就是函数
xxx --> xxx就是函数
打印查看:
function
method
判断是方法还是函数?from types import MethodType,FunctionType
def check(arg):
"""
检查arg是方法还是函数?
:param arg:
:return:
"""
if isinstance(arg,MethodType):
print('arg是一个方法')
elif isinstance(arg,FunctionType):
print('arg是一个函数')
else:
print('不知道是什么')
3. 反射
总结:
v = getattr(obj,"func") # 根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员。
好记:
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存

1 class Account(object):
2 func_list = ['login', 'logout', 'register']
3
4 def login(self):
5 """
6 登录
7 :return:
8 """
9 print('登录111')
10
11 def logout(self):
12 """
13 注销
14 :return:
15 """
16 print('注销111')
17
18 def register(self):
19 """
20 注册
21 :return:
22 """
23 print('注册111')
24
25 def run(self):
26 """
27 主代码
28 :return:
29 """
30 print("""
31 请输入要执行的功能:
32 1. 登录
33 2. 注销
34 3. 注册
35 """)
36
37 choice = int(input('请输入要执行的序号:'))
38 func_name = Account.func_list[choice-1]
39
40 # func = getattr(Account,func_name) # Account.login
41 # func(self)
42
43 func = getattr(self, func_name) # self.login
44 func()
45
46 obj1 = Account()
47 obj1.run()
48
49 obj2 = Account()
50 obj2.run()

1 from types import FunctionType
2 import handler
3
4 while True:
5 print("""
6 系统支持的函数有:
7 1. f1
8 2. f2
9 3. f3
10 4. f4
11 5. f5
12 """)
13 val = input("请输入要执行的函数:") # val = "f1"
14
15 # 错误
16 # handler.val()
17 if hasattr(handler,val):
18 func_or_val = getattr(handler,val) # 根据字符串为参数,去模块中寻找与之同名的成员。
19 if isinstance(func_or_val,FunctionType):
20 func_or_val()
21 else:
22 print(func_or_val)
23 else:
24 print('handler中不存在输入的属性名')
25
26 # 正确方式
27 """
28 if val == 'f1':
29 handler.f1()
30 elif val == 'f2':
31 handler.f2()
32 elif val == 'f3':
33 handler.f3()
34 elif val == 'f4':
35 handler.f4()
36 elif val == 'f5':
37 handler.f5()
38 """
问题:你见过的什么后面可以加()?
- 类()
- 对象()
- 函数()
- 方法()
以上所有都可以被调用。
def func():
pass
class Foo(object):
def __call__(self, *args, **kwargs):
pass
def func(self):
pass
obj = Foo()
print(callable(func))
print(callable(Foo))
print(callable(obj))
print(callable(obj.func))
