代码改变世界

2018.3.23学习笔记(利用反射查看成员、静态字段、静态方法、类方法、特性)

2018-03-24 23:04  冒牌权限  阅读(123)  评论(0)    收藏  举报

利用反射查看成员

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class fuck:

    def __init__(self,name):
        self.name = name

    def func(self):
        pass

print(hasattr(fuck,'name'))#由于没有初始化,所以单纯的fuck类里面是没有name的
obj = fuck('fuck')
print(hasattr(obj,'name'))#初始化,得到一个对象obj,obj里面就有name成员了
print(obj.name)

静态字段

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Provice:

    ziduan = 'wo le ge cha'#静态字段,属于类

    def __init__(self,name):#普通字段,属于对象
        self.name = name

    def func(self):#普通方法,属于对象
        pass

print(Provice.ziduan)#可以看到对象创建之前,就可以访问!推荐使用类来访问,规范:在python中,谁的成员由谁来访问
obj = Provice('fuck you')
print(obj.name)
print(obj.ziduan)#对于静态字段,虽然对象可以访问,但是不推荐这么用,因为在别的语言可能不支持

静态方法、类方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Provice:

    ziduan = 'wo le ge cha'#静态字段,属于类

    @staticmethod
    def j_func():#需要@staticmethod装饰,就可以变成静态方法,无self
        print('静态方法')

    @classmethod
    def c_func(cls):#需要@classmethod装饰,就可以变成类方法,有cls参数,很像静态方法的加cls参数特殊情况
        print(cls,type(cls))

    def __init__(self,name):#普通字段,属于对象
        self.name = name

    def func(self):#普通方法,属于对象
        pass

Provice.j_func()#类访问静态方法,推荐使用
Provice.c_func()#类访问类方法,推荐使用
obj = Provice('fuck you')
obj.j_func()#对象访问静态方法,同样遵照谁的成员由谁来访问规范,所以不推荐这么使用

特性

#!/usr/bin/env python
# -*- coding:utf-8 -*-

class Provice:

    def __init__(self,name):
        self.name = name

    @property#获取值
    def func(self):#加@property将方法伪造成字段
        temp = "%s sb"%self.name
        return temp
    @func.setter#设置值
    def func(self,value):
        self.name = value

obj = Provice('')
print(obj.func)#伪造成字段,不用加括号就执行了
obj.func = '还是习总'#如果没有setter,则会报错
print(obj.func)