zoukankan      html  css  js  c++  java
  • 面向对象在加深

    内容补充:

    把不可迭代对象变成可迭代对象:  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) # 打印结果为错误


     

  • 相关阅读:
    To the Virgins, to Make Much of Time
    瓦尔登湖
    贪心算法
    R语言实战 —— 常见问题解决方法
    R语言实战(四)—— 基本数据管理
    R语言实战(三)——模拟随机游走数据
    Vim——回顾整理
    Clion下载安装使用教程(Win+MinGW)
    【ACM】孪生素数问题
    【ACM】一种排序
  • 原文地址:https://www.cnblogs.com/lingcai/p/9588150.html
Copyright © 2011-2022 走看看