变幻莫测的python(三)---类

来源:互联网 发布:web视频会议系统源码 编辑:程序博客网 时间:2024/05/22 12:54

类定义及类属性和方法以及访问权限

class Csen:    classname='类属性'#可以直接被类访问    __pname='类私有属性'#不可以被类或实例访问到    __doc__='这是一个专有属性'#专有属性,保存类的基本信息,不需要调用和修改    def __init__(self):#专有函数,__init__相当于构造函数,但不是(类实例化好才被自动调用),专有方法只能实例才能访问        self.insname='实例变量'#实例化好后才能被调用,不能被类访问,可以被实例访问        self.__pinsname='私有实例变量'#只能被本类代码使用,外部访问不到,实例也访问不到        methname='局部变量'#只能在本函数内访问到,外部函数访问不到        print(methname)        self.__pfun()#专有函数也可以访问本类私有函数,即私有函数可以访问私有函数    def fun(self):#普通方法可以访问类变量也能访问实例变量,也可以访问本类的函数或私有函数,即一切都可以访问到        self.__pfun()#可以访问本类的私有函数        print('类私有属性:'+self.__pname+'-->类属性:'+self.classname+'实例变量:'+self.insname+'实例私有变量:'+self.__pinsname)    @staticmethod#类静态方法,没有参数传入,可以被类或实例访问到,无法访问到实例变量和类变量和本类函数    def sfun():        print('类方法(静态方法),无法访问实例变量和类变量,因为没有self或cls参数传入呀')    @classmethod#类成员方法可以被实例或类访问到,需传入代表本类的cls参数(名字可以任意),                # 但注解需要加上,无法访问实例变量或方法和类的私有变量或类的私有函数但可以访问类变量    def cfun(cls):         print ('类成员方法:' + str(cls)+'类属性:'+cls.classname+'-->类私有属性'+cls.__pname)         #cls.__pfun()#不能访问本类私有函数         #cls.fun()#也不能访问本类的函数    def __pfun(self):#类和实例不能访问,只有在本类其他函数才能访问到,但是如果是__xxx__函数则实例能访问到类不能但一般不声明因为是其有特殊意义对于编译器来说         print('类私有方法'+'类私有属性:'+self.__pname+'-->类属性:'+self.classname+'实例变量:'+self.insname+'实例私有变量:'+self.__pinsname)    def __aaa__(self):#不要自己写这样的函数        print('类私有方法'+'类私有属性:'+self.__pname+'-->类属性:'+self.classname+'实例变量:'+self.insname+'实例私有变量:'+self.__pinsname)print(Csen.classname)#直接访问类属性Csen.sfun()#直接访问类静态方法Csen.cfun()#直接访问类方法a=Csen()#实例化类a.__aaa__()print(a.__hash__())#直接访问专有方法a.cfun()#访问实例化方法print(a.classname)#访问类方法print(a.__doc__)#访问专有属性print(a.insname)#访问实例属性a.fun()#访问普通属性a.cfun()#访问类属性#诡异现象演示Csen.classname='直接更改类属性'a=Csen();b=Csen()print(a.classname)print(b.classname)print(Csen.classname)#直接更改类属性#直接更改类属性#直接更改类属性#全部变化,因为更改的类属性,所以实例化后的属性全部改变a.classname='在实例上更改类属性'print(a.classname)print(b.classname)print(Csen.classname)#在实例上更改类属性#直接更改类属性#直接更改类属性#从实例的角度上更改类的属性Csen.classname='直接更改类属性第二次'#第二次从类角度更改类的属性,按道理应该每个实例都会打印#'直接更改类属性第二次‘print(a.classname)print(b.classname)print(Csen.classname)#结果#在实例上更改类属性#直接更改类属性第二次#直接更改类属性第二次#这是因为a.classname='在实例上更改类属性'其实是新增加了一个classname的实例属性,而实例属性覆盖了类属性,所以才会没有改变#如果想要得到a的类属性应该这样print(a.__class__.classname)print(b.classname)print(Csen.classname)#直接更改类属性第二次#直接更改类属性第二次#直接更改类属性第二次

运行结果:

F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
类属性
类方法(静态方法),无法访问实例变量和类变量,因为没有self或cls参数传入呀
类成员方法:<class '__main__.Csen'>类属性:类属性-->类私有属性类私有属性
局部变量
类私有方法类私有属性:类私有属性-->类属性:类属性实例变量:实例变量实例私有变量:私有实例变量
类私有方法类私有属性:类私有属性-->类属性:类属性实例变量:实例变量实例私有变量:私有实例变量
1688751
类成员方法:<class '__main__.Csen'>类属性:类属性-->类私有属性类私有属性
类属性
这是一个专有属性
实例变量
类私有方法类私有属性:类私有属性-->类属性:类属性实例变量:实例变量实例私有变量:私有实例变量
类私有属性:类私有属性-->类属性:类属性实例变量:实例变量实例私有变量:私有实例变量
类成员方法:<class '__main__.Csen'>类属性:类属性-->类私有属性类私有属性
局部变量
类私有方法类私有属性:类私有属性-->类属性:直接更改类属性实例变量:实例变量实例私有变量:私有实例变量
局部变量
类私有方法类私有属性:类私有属性-->类属性:直接更改类属性实例变量:实例变量实例私有变量:私有实例变量
直接更改类属性
直接更改类属性
直接更改类属性
在实例上更改类属性
直接更改类属性
直接更改类属性
在实例上更改类属性
直接更改类属性第二次
直接更改类属性第二次
直接更改类属性第二次
直接更改类属性第二次
直接更改类属性第二次


Process finished with exit code 0

类的继承和专有方法专有属性

class FPerson:    name='父类:类属性'    def __init__(self):        self.fname='实例属性'        print('父类初始化方法:--->'+'父类类属性:'+self.name)    def fun(self):        print('父类方法')class FFPerson:    def __init__(self):        print('父父类初始化方法')    def fun(self):        print('父父类函数')class SPerson(FPerson,FFPerson):#继承了父进程的所有公有实例变量和方法,可以继承多个class SPerson(FPerson,xxx,xxxx)    """      这个就是doc显示的时候会显示    """    name = '子类:类属性,覆盖父类类属性'#会覆盖掉父类属性当再次使用父类方法时候其实例name类属性将被覆盖掉    def __init__(self):        FPerson.__init__(self)#继承父类必须显示调用父类初始化方法,name覆盖实例父类的name        FFPerson.__init__(self)        self.pname='子类实例变量'        self.fname='子类实例变量与父类重名'        print('子类初始化方法:-->'+self.pname+'==='+self.fname)    def fun(self,str):#python中没有重载方法一说,如果方法名字一样,默认使用最后一个方法作为有效方法        print('子类方法,方法重载'+str)    def fun(self):        print('子类方法,覆盖父类方法')        name='函数中定义的函数'        def fun2():            return name+'<---->'        print(fun2())#只能在本方法中调用        return  fun2()+'添加一些东西'    #以下为复写专有方法    def __del__(self):        print('对象被销毁了')    def __str__(self):                return '相当于toString'    def __getitem__(self, key):         if key == 'dog':return 'dog'         elif key == 'pig':return  'pig'         elif key == 'wolf':return 'wolf'         else:return 'unknown'    def __setitem__(self, key, value):         print ('key=%s,value=%s' % (key, value))    #def __eq__(self, obj):    #    return self.name == obj.namef=FPerson()s=SPerson()print(FPerson.name)print(SPerson.name)print(f.fname)print(s.fname)print(s.pname)f.fun()print(s.fun())#专有属性#print(s.__flags__)print(s.__doc__)print(s.__class__)#print(s.__base__)#print(s.__bases__)#print(s.__basicsize__)#print(s.__itemsize__)print(s.__module__)#print(s.__mro__)#print(s.__name__)#print(s.__qualname__)#print(s.__weakrefoffset__)#print(s.__abstractmethods__)#专有方法s.__init__()#初始化print(s.__getattribute__('name'))#获取属性print(s.__dir__())#获取示实例变量,还有实力所在类及所有它的基类中定义的方法和类属性s.__delattr__('pname')#删除属性#print(s.__eq__(SPerson))#判断是否相等print(s.__hash__())#获取hash值print(s.__sizeof__())#获得大小print(s.__repr__())s.__str__()#描述类print(s)#__getitem__print (s['wolf'])#字典操作#__setitem__s['ccc'] = 'senssic'#字典操作print(s)s.__del__()#销毁

运行结果:
F:\soft\workprogram\python3.3\python.exe E:/workspace/pythonwork/senssic/sen.py
父类初始化方法:--->父类类属性:父类:类属性
父类初始化方法:--->父类类属性:子类:类属性,覆盖父类类属性
父父类初始化方法
子类初始化方法:-->子类实例变量===子类实例变量与父类重名
父类:类属性
子类:类属性,覆盖父类类属性
实例属性
子类实例变量与父类重名
子类实例变量
父类方法
子类方法,覆盖父类方法
函数中定义的函数<---->
函数中定义的函数<---->添加一些东西


      这个就是doc显示的时候会显示
    
<class '__main__.SPerson'>
__main__
父类初始化方法:--->父类类属性:子类:类属性,覆盖父类类属性
父父类初始化方法
子类初始化方法:-->子类实例变量===子类实例变量与父类重名
子类:类属性,覆盖父类类属性
['__getattribute__', '__lt__', '__reduce__', '__module__', '__gt__', '__repr__', '__doc__', '__str__', '__class__', '__subclasshook__', '__delattr__', 'fun', 'fname', '__init__', '__reduce_ex__', 'pname', '__ge__', '__eq__', '__hash__', '__dir__', '__setattr__', '__del__', '__le__', '__getitem__', 'name', '__setitem__', '__format__', '__sizeof__', '__new__', '__ne__', '__weakref__', '__dict__']
1674879
16
<__main__.SPerson object at 0x0198E7F0>
相当于toString
wolf
key=ccc,value=senssic
相当于toString
对象被销毁了
对象被销毁了


Process finished with exit code 0

1 0
原创粉丝点击