python面向对象之成员保护和访问限制

在类的内部,有变量和方法,这些变量和方法可以在类的外部通过实例或者类名进行调用,例如:

class Father():
    s1 = '这是父类的第一个变量'
    s2 = '这是父类的第二个变量'
    @classmethod
    def cls_mythod(cls):
        print('我是类的方法')
    def oth_mythod(self):
        print("这是oth_mythod函数")
        i = int(input("请输入oth_mythod的第一个参数:\n"))
        j = int(input("请输入oth_mythod的第二个参数:\n"))
        m =i*j
        print(m)
Father.cls_mythod()
father = Father()
father.oth_mythod()
print("通过父类对象访问第一个父类的变量")
father.s1

结果是:

D:\*************************************************\3.py 
我是类的方法
这是oth_mythod函数
请输入oth_mythod的第一个参数:
2
请输入oth_mythod的第二个参数:
3
6
通过父类对象访问第一个父类的变量
Process finished with exit code 0

通过对象可以很轻松的访问对象所属类的成员变量
但是有时候希望能够保护其中变量和方法不能被外部访问,针对地保护某些成员,限制对这些成员的访问。
如果想要内部成员不被外部访问,需要在成员的名字前加上两个下划线’__',这样成员就变成了私有成员(private)。私有成员只能够在类的内部进行访问,外部无法访问如:
还是上一个程序,在s2面前加上__使这个变量变成私有变量,如果这个时候通过实例或者类调用,结果如下:

__s2 = '这是父类的第二个变量'

运行后:

Traceback (most recent call last):
  File "D:\*************************\3.py", line 18, in <module>
    father.s2
AttributeError: 'Father' object has no attribute 's2'. Did you mean: 's1'?

在外部找不到类的私有变量,换成类名也一样
注意:
前面带有__不一定都是私有成员,还有可能使特殊变量或者方法如:__init
&
&
&

反射:reflect
使用一个函数:getattr(),注意这个函数需要传递两个参数,第一个模块的名称,第二个使模块的方法名字或者模块里面的参数在使用得到的方法时,要在gettattr(模块名,方法名)加上()
而hasattr(模块名,方法名),会去当前模块进行寻找当前的方法如果找到返回ture否则返回 false,并不会终止程序。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值