zoukankan      html  css  js  c++  java
  • 面向对象三 组合 特殊成员

    一.组合

    class Foo(object):
        def __init__(self,age):
            self.age = age
        def display(self):
            print(self.age)
    data_list = [Foo(8),Foo(9)]
    for item in data_list:
        print(item.age,item.display())
    #结果:8   8  None   9   9   None
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
    class RoleConfig(StarkConfig):
        def changelist(self,request):
            print("666")
    config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
    for item in config_obj_list:
        print(item.num)
    实例
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
    class RoleConfig(StarkConfig):
        pass
    config_obj_list=[StarkConfig(1),StarkConfig(2),RoleConfig(3)]
    for item in config_obj_list:
        item.changelist(168)
    #结果:1 168 2 168 3 168
    实例
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
    class RoleConfig(StarkConfig):
        def changelist(self,request):
            print(666,self.num)
    config_obj_list=[StarkConfig(1),StarkConfig(2),RoleConfig(3)]
    for item in config_obj_list:
        item.changelist(168)
    #结果: 1 168  2 168  666 3
    实例
    实例
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
        def run(self):
            self.changelist(999)
    class RoleConfig(StarkConfig):
        def changelist(self,request):
            print(666,self.num)
    class AdminSite(object):
        def __init__(self):
            self._registry = {}
        def register(self,k,v):
            self._registry[k] = v
    site = AdminSite()
    print(len(site._registry))
    site.register("range",666)
    site.register("shilei",438)
    print(len(site._registry))
    #结果: 0  2
    在字典中的
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
        def run(self):
            self.changelist(999)
    class RoleConfig(StarkConfig):
        def changelist(self,request):
            print(666,self.num)
    class AdminSite(object):
        def __init__(self):
            self._registry = {}
        def register(self,k,v):
            self._registry[k] = v
    site = AdminSite()
    # print(len(site._registry))
    # site.register("range",666)
    # site.register("shilei",438)
    # print(len(site._registry))
    site.register("lyd",StarkConfig(19))
    site.register("yjl",StarkConfig(20))
    site.register("fgz",RoleConfig(33))
    print(len(site._registry))
    for k,row in site._registry.items():
        row.changelist(5)
    #结果:  19 5  20 5  666 33
    面向对象在字典的应用
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
        def run(self):
            self.changelist(999)
    class RoleConfig(StarkConfig):
        def changelist(self,request):
            print(666,self.num)
    class AdminSite(object):
        def __init__(self):
            self._registry = {}
        def register(self,k,v):
            self._registry[k] = v
    site = AdminSite()
    site.register("lyd",StarkConfig(19))
    site.register("yjl",StarkConfig(20))
    site.register("fgz",RoleConfig(33))
    print(len(site._registry))
    for k,row in site._registry.items():
        row.run()
    #结果: 19 999  20 999  666 33
    实例
    class Userlnfo(object):
        pass
    class Department(object):
        pass
    class StarkConfig(object):
        def __init__(self,num):
            self.num = num
        def changelist(self,request):
            print(self.num,request)
        def run(self):
            self.changelist(999)
    class RoleConfig(StarkConfig):
        def changelist(self,request):
            print(666,self.num)
    class AdminSite(object):
        def __init__(self):
            self._registry = {}
        def register(self,k,v):
            self._registry[k] = v(k)
    site = AdminSite()
    site.register(Userlnfo,StarkConfig)
    site.register(Department,StarkConfig)
    print(len(site._registry))
    for k,row in site._registry.items():
        row.run()
    #结果:  Userlnfo类 999
    #      Department类 999
    实例

    总结:

      1.对象中封装了什么

      2.self 到底是谁

    二.主动调用其它类的成员

      方式一:

    class Base:
        def f1(self):
            print("5个功能")
    class Foo:
        def f1(self):
            print("3个功能")
            Base.f1(self)
    obj = Foo()
    obj.f1()

    总结:

      Base.实例方法(自己传self)

      与继承无关

      方式二:按照类的继承顺序,找下一个

    class Foo:
        def f1(self):
            super().f1()
            print("3个功能")
    class Bar:
        def f1(self):
            print("5个功能")
    class lnfo(Foo,Bar):
        pass
    obj = lnfo()
    obj.f1()
    class Foo:
        def f1(self):
            print("5个功能")
    class Bar(Foo):
        def f1(self):
            super().f1()
            print("3个功能")
    obj = Bar()
    obj.f1()
    View Code

    三.特殊成员

    1. __doc__

      表示类的描述信息

    1 class Foo:
    2     """ 描述类信息,这是用于看片的神奇 """
    3 
    4     def func(self):
    5         pass
    6 
    7 print Foo.__doc__
    8 #输出:类的描述信息

    2. 类名()   自动执行__init__ # 初始化方法

      初始化数据,通过类创建对象时,自动触发执行。

    class Foo:
    
        def __init__(self, name):
            self.name = name
            self.age = 18
    
    
    obj = Foo('wupeiqi') 
    # 自动执行类中的 __init__ 方法

    3.对象()  自动执行__call__

    class  Foo(object):
         def __call__(self,*args,**kwargs):
              print(520,args,kwargs)
              return 
    obj
    = Foo() obj(3,6,5,k1= 582) #11111 (6, 4, 2) {'k1': 456}

    4. 对象["xx"]   自动执行 __getitem__

    class Foo (object):
      def __getijtem__(self,item):
      print(item):
        return "ss"
    obj = Foo()
    ret = obj[ "wang"] print(ret) # wang ss

    5.对象["ss"] = 11    自动执行__setitem__

    class Foo(object)
        def  _getitem__(self,key,value):
          print(key,value,520)
    obj = Foo()
    obj["shuzi"] = 666      
    # shuzi 666 520

    6.del   对象[xx]       自动执行__delitem__

    class  Foo (object):
        def __delitem__(self,key):
          print(key)
    obj = Foo()
    del  obj["wang"]  
    # wang

    7.对象+对象      自动执行__add__

    class  Foo(object)
        def __init__(self,s1,s2):
          self.s1 = s1
          self.s2 = s2
        def__add__(self,other):
            return  self.s1 + other.s2
    obj1 = Foo(1,2)
    obj2 = Foo(88,99)
    ret = obj1 + obj2
    print(ret)   
    # 100

    8. with 对象     自动执行__enter__/ __exit__

    class  Foo(object):
         def __init__(self,s1,s2):
             self.s1 = s1
             self.s2 = s2
         def __enter__(self):
             print("520")
    return 999 def __exit__(self,exc_type,exc_val,exc_tb): print("251") obj = Foo(1,2) with obj as f: print(f) print("代码块")
    # 520 999 代码块 251

      9. __new__ 构造方法

    class Foo(object):
        def __init__(self, a1, a2):     # 初始化方法
            """
            为空对象进行数据初始化
            :param a1:
            :param a2:
            """
            self.a1 = a1
            self.a2 = a2
    
        def __new__(cls, *args, **kwargs): # 构造方法
            """
            创建一个空对象
            :param args:
            :param kwargs:
            :return:
            """
            return object.__new__(cls)

    10. __dict__   类或对象中的所有成员

      类的普通字段属于对象;类中的静态字段和方法等属于类,

    class Province:
    
        country = 'China'
    
        def __init__(self, name, count):
            self.name = name
            self.count = count
    
        def func(self, *args, **kwargs):
            print 'func'
    
    # 获取类的成员,即:静态字段、方法、
    print Province.__dict__
    # 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}
    
    obj1 = Province('HeBei',10000)
    print obj1.__dict__
    # 获取 对象obj1 的成员
    # 输出:{'count': 10000, 'name': 'HeBei'}
    
    obj2 = Province('HeNan', 3888)
    print obj2.__dict__
    # 获取 对象obj1 的成员
    # 输出:{'count': 3888, 'name': 'HeNan'}

    11. __iter__ 

    用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ 

    class Foo(object):
    
        def __init__(self, sq):
            self.sq = sq
    
        def __iter__(self):
            return iter(self.sq)
    
    obj = Foo([11,22,33,44])
    
    for i in obj:
        print i

    创建类就可以有两种方式:

      a). 普通方式

    class Foo(object):
     
        def func(self):
            print 'hello wupeiqi'

      b).特殊方式(type类的构造函数)

    def func(self):
        print 'hello wupeiqi'
     
    Foo = type('Foo',(object,), {'func': func})
    #type第一个参数:类名
    #type第二个参数:当前类的基类
    #type第三个参数:类的成员
  • 相关阅读:
    Hybrid APP基础篇(四)->JSBridge的原理
    剑指offer
    剑指offer
    如何在HTML中设置文本的大小写
    如何给HTML标签中的文本设置修饰线
    CSS设置文本的水平对齐方向
    如何在HTML中设置字体颜色,你知道这几种方式吗?
    CSS尺寸样式属性
    CSS基本选择器是什么?基本选择器是如何工作
    如何创建 CSS
  • 原文地址:https://www.cnblogs.com/chenxi67/p/9555772.html
Copyright © 2011-2022 走看看