Discuss / Python / setattr, getattr, hasattr 这三个attr不可用来处理私有变量

setattr, getattr, hasattr 这三个attr不可用来处理私有变量

Topic source
class Gender_horse(object):
    def seta(self, gender):
        setattr(self, '__gender', gender)

    def set(self, gender):
        self.__gender = gender

    def geta(self):
        return getattr(self, '__gender')

    def get(self):
        return self.__gender


dilu = Gender_horse()
# 在 class 中定义私有属性
dilu.set('Female')
print(hasattr(dilu, '__gender'), dir(dilu))
print(getattr(dilu, '__gender', None), dilu.get())

# 在 class 中用三个 attr 定义非私有属性
dilu.seta('Lesbian')
print(hasattr(dilu, '__gender'), dir(dilu))
print(getattr(dilu, '__gender', None), dilu.get(), dilu.geta())

# 只有在不知道对象信息的时候, 我们才会去获取对象信息. 

# 三个 attr 相比于 x.y 的直接调用, 还有优点就是, 'y'是字符串, 可以是变量, 是可从客户端输入的! 而不必须嵌进代码.

# 注意, 三个 attr 仍然是外部程序对 x 的调用, 因此同样无法经过私有变量的加密, 即使是在 class 里面使用三个 attr!

# 当然, 私有变量的私有, 不仅包括代码端两个 class 或两个开发者的相互隐藏, 还包括对用户端的隐藏.


  • 1

Reply