##类成员包括:
#字段:静态字段、普通字段    字段也可以理解为“变量”
#方法:普通方法、静态方法、类方法;所有方法属于类    方法也可以理解为“函数”
#属性:具有方法的定义形式,具有字段访问形式         用字段的访问方式调用方法,就需要定义“属性”
#当不想创建对象访问类中方法时,方法需要是静态方法

##成员修饰符
#公有字段   内外都可以访问
#__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)