python3学习之类成员、扩展父类方法

发布时间:2019-09-25 08:23:39编辑:auto阅读(1405)

    ##类成员包括:
    #字段:静态字段、普通字段    字段也可以理解为“变量”
    #方法:普通方法、静态方法、类方法;所有方法属于类    方法也可以理解为“函数”
    #属性:具有方法的定义形式,具有字段访问形式         用字段的访问方式调用方法,就需要定义“属性”
    #当不想创建对象访问类中方法时,方法需要是静态方法
    
    ##成员修饰符
    #公有字段   内外都可以访问
    #__name   私有字段,前面有两个下划线,只在类中可以访问,通过对象访问不了 ,继承的父类和子类中也无法调用,只在本类中可以
    #PS:不到万不得已不要在外部访问私有字段,obj._Foo__name   该方式可以访问私有字段
    
    
    ##特殊成员 __xxxx__
    #__init__     构造方法,创建对象时自动执行
    #__del__      析构方法,回收闲置对象占用的内存之前自动执行该函数,不需要自己定义,python自动执行
    #__doc__      注释、说明
    #__class__    当前类
    #__call__     对象后面加括号,调用类的__call__方法,__call__需要在类中定义
    #__str__      打印对象时是对象的内存地址,类中定义了__str__方法后,可以自定义输出内容及格式
    #__dict__     打印该对象包含的所有方法
    #__getitem__   __setitem__  __delitem__   当对象参数是列表时,实际上调用了这些方法
    #__iter__     对象默认不可迭代,当定义了该方法,才可以;当对象放在for循环里,默认调用对象的__iter__方法(这是规定)
    #issubclass(cls1,cls2)    判断cls1是不是cls2的子类,返回True或者False
    #isinstance(obj,classname)   判断obj是不是classname的实例(继承也算是)
    
    ##调用父类方法
    #方法1  主动执行父类的方法:  super(子类,self).父类方法;扩展父类方法的功能时使用;父类和子类的方法名需要相同
    #方法2  通过类调用,一般不用
    
    
    #
    # class Foo:
    #     CC = 123   #CC叫静态字段,保存在类里,可以通”过类.字段“访问,也可以通过对象访问,java中只能通过类访问
    #
    #     def __init__(self):
    #         self.name = 'test'  #name 就叫字段(普通字段),保存在对象里
    #
    #     def show(self):     #普通方法,通过对象调用  ,self必须有
    #         print(self.name)
    #         return "sssss"
    #
    #     @staticmethod     #静态方法定义,通过类调用,相当于函数
    #     def f1(x):        #参数可有可无
    #         print(x+"==lllllll")
    #
    #     @classmethod     #类方法定义
    #     def f2(cls):     #cls 参数必须有,是类名,通过类调用
    #         print(cls)
    #
    #     @property   #属性定义  通过Foo.f3调用
    #     def f3(self):   #self必须有
    #         return self.name + 1
    #
    #     @f3.setter   #给属性传值  通过 Foo.f3 = 123
    #     def f3(self,value):
    #         print(value)
    #
    #     @f3.deleter  #属性删除,并不是要删除f3,只是调用了f3,执行代码为pass(可以是任意代码) 通过del  Foo.f3
    #     def f3(self):
    #         pass
    #
    #
    # class shuxing:
    #
    #     def f1(self):
    #         pass
    #
    #     def f2(self,value):
    #         print(value)
    #
    #     def f3(self):
    #         pass
    #
    #     def __getitem__(self, item):
    #         pass
    #
    #     def __setitem__(self, key, value):
    #         pass
    #
    #     def __delitem__(self, key):
    #         pass
    #
    #
    #     foo = property(fget=f1,fset=f2,fdel=f3)   #另一种属性定义方式,fget fset fdel 是固定关键字
    #
    
    #注意:默认规则 静态字段要通过类访问;普通字段通过对象访问
    
    # obj = Foo()
    # print(Foo.f1("iiiii"))   #静态方法调用
    # print(obj.show())        #普通方法调用
    # Foo.f2()        #类方法调用
    # print(Foo.f3)          #属性调用,不加括号
    # d = Foo.__dict__
    # print(type(d),d)
    
    #扩展字典,增加字典有序的属性,借助列表
    #字典可以赋值,可以打印
    class MyDict(dict):
    
        def __init__(self):
            self.li = []
            super(MyDict,self).__init__()
    
        def __setitem__(self, key, value):
    
            self.li.append(key)
            super(MyDict, self).__setitem__(key, value)
    
        def __str__(self):
            t = []
            # ml = super(MyDict,self).get()
            for k in self.li:
                v =self.get(k)
                t.append("'%s':%s" %(k,v))
    
            return "{" + ",".join(t) + "}"
    
    
    d = MyDict()
    # d2 = MyDict()
    
    d["k1"] = 123
    d["k2"] = 456
    d["k3"] = 45611
    print(d)

关键字