面向对象在加深

内容补充:

把不可迭代对象变成可迭代对象:  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,55,66])  返回一个可迭代对象

        yield 11
        yield 22
        yield 33  #返回生成器类型可迭代对象

# obj1是Foo类的一个对象,可迭代对象
"""
obj1 = Foo('刘博文',99)

for item in obj1:
    print(item)   #结果为 11  22  33
View Code

练习题补充:

# 第一题:

# 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
View Code
# 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()
# s2 = StarkConfig()
#
# result1 = s1.get_list_display()
# print(result1)  # 33
#
# result2 = s2.get_list_display()
# print(result2)  # 33

 

issubclass/isinstance/type

issubclass(a,b):检查a是否是b的子孙类

class Base(object):
    pass

class Foo(Base):
    pass

class Bar(Foo):
    pass

print(issubclass(Bar,Base)) # 检查第一个参数是否是第二个参数的 子子孙孙类

type(a):获取当前对象a由哪个类创建,,只能判断对象与类的父子关系,不包含爷孙关系

class Foo(object):
    pass

obj = Foo()

print(obj,type(obj)) # 获取当前对象是由那个类创建。
if type(obj) == Foo:
    print('obj是Foo类型')

isinstance(a,b):检查第一个参数a是否是第二个参数(类及其父类)b的实例.

class Base(object):
    pass

class Foo(Base):
    pass

obj1 = Foo()
print(isinstance(obj1,Foo))  #True  检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
print(isinstance(obj1,Base)) #True 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

用科学的方法判断方法与函数

简单称谓:定义在类内部的函数称之为方法,定义在外部的函数就是函数.  其实与定义无关,而是与调用对象有关,  类名.函数名()是函数     对象.函数名()是方法

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('不知道是什么')


def func(): pass class Foo(object): def detail(self): pass @staticmethod def xxx(): pass check(func) #arg是一个函数 obj = Foo() check(obj.detail)# arg是一个方法 check(obj.xxx)# arg是一个函数

 

反射:

getattr # 根据字符串的形式,去对象中找成员。

模块类型:

1自定义一个模块:handler

f0 = 9

def f1():
    print('F1')

def f2():
    print('F2')

def f3():
    print('F3')

def f4():
    print('F4')

def f5():
    print('F5')

2在其他程序中调用:run 
from types import FunctionType   #引入判断函数方法
import handler  #引入handler模块

while True:
    print("""
    系统支持的函数有:
        1. f1
        2. f2
        3. f3
        4. f4
        5. f5
    """)
    val = input("请输入要执行的函数:")     # val = "f1"

        #handler.val()       # 错误方式 因为val 是字符串,不能字符串+()
#正确反射方式
    if hasattr(handler,val):   #判断handler中有val
        func_or_val = getattr(handler,val)     # 根据字符串为参数,去模块中寻找与之同名的成员。
        if isinstance(func_or_val,FunctionType):#func_or_val是函数类型
            func_or_val()    #调用函数
        else:#不是函数类型
            print(func_or_val)  #打印值
    else:
        print('handler中不存在输入的属性名')#判断handler中没有val

    # 正确if语句方式
    """
    if val == 'f1':
        handler.f1()
    elif val == 'f2':
        handler.f2()
    elif val == 'f3':
        handler.f3()
    elif val == 'f4':
        handler.f4()
    elif val == 'f5':
        handler.f5()
    """
    country = "中国"

    def func(self):
        pass


# v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。
# print(v)

# obj = Foo()
# v = getattr(obj,"func")  # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。
# print(v)

 


hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存):尽量少使用 程序可读性差,不方便交流.
delattr # 根据字符串的形式,动态的删除一个成员(内存)
xx模块:

x1 = 123

def f1(arg):
    print(arg,666)


另一模块:
import xx  #引入XX模块

# getattr
v1 = getattr(xx,'x1')  #去xx模块中寻找x1同名成员
v2 = getattr(xx,'f1')  #去xx模块中寻找f1同名成员
v2('杨森')  #存在f1的话 调用f1并传值杨森

# hasattr
v3 = hasattr(xx,'x1') #判断xx中有无x1成员
v4 = hasattr(xx,'f1')  #判断xx中有无f1成员
v5 = hasattr(xx,'xxxxxxx')  #判断xx中有无xxxxxxx成员
print(v3,v4,v5)  #打印结果 True  True  False
 
# setattr
setattr(xx,'x2',999)  # 在xx模块内存地址中动态添加一个变量x2=999
v6 = getattr(xx,'x2')  #去xx模块中寻找x2同名成员
print(v6)  #打印结果为 999

setattr(xx,'f2',lambda x:x+1)#动态添加一个函数
v7 = getattr(xx,'f2')#去xx模块中寻找f2同名成员
v8 = v7(1) # 调用v7
print(v8)  打印出  2

# delattr
delattr(xx,'x1') # 在xx模块内存地址中动态删除x1
v9 = getattr(xx,'x1')# 去xx模块中寻找x1同名成员
print(v9) # 打印结果为错误

 



 

 

posted @ 2018-09-04 20:00  领财  阅读(139)  评论(0编辑  收藏  举报