python面向对象编程(三)变量和方法的可见性

在类中定义的变量和方法,在外界是可以直接调用变量或方法去访问,可以随意的更改类中变量:

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def fn(self):
        pass
p = Person('lxc',20)
p.name = '呆呆君'
print(p.name) # '呆呆君'

上边代码,在初始化的时候,传入了姓名和年龄,结果在外界又把姓名给修改了,有时候这不是我们期望的结果!

在Python中,可以给方法或者变量前边加上双下划线_ _ variable、 _ _fn,来定义一个私有变量 或 私有方法:

class Person():
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
    def __fn(self):
        pass
p = Person('lxc',20)
print(p.__name) # 报错 'Person' object has no attribute '__name'
p._fn() # 报错

上边代码,在实例方法和类中分别定义了私有变量和私有方法,外界访问是结果报错!!!

再来看下,如果我们在外界去修改类中的私有变量,能修改吗:

class Person():
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
    def __fn(self):
        pass
p = Person('lxc',20)
p.__name = '呆呆君'
print(p.__name) # '呆呆君'

神奇的事情发生了,上边代码,我们在外界尝试去修改实例方法中的私有变量,结果怎么又能访问到修改的私有属性了,在外界不是不能访问类中的私有变量吗???不仅能修改,还能访问???

别慌!我们通过python中的一个内置方法__dict__,它可以访问到一个对象里边所有的属性及方法,输出一下实例中的所有变量:

class Person():
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
    def __fn(self):
        pass
p = Person('lxc',20)
p.__name = '呆呆君' 
print(p.__dict__) # {'_Person__name': 'lxc', '_Person__age': 20, '__name': '呆呆君'}

上边代码,结果发现在实例方法中定义的私有变量名字,被Python给修改了,这是python在内部帮我们做的事情!!!

(1)在外界本来想去修改实例中的私有属性,结果是在实例中添加了一个新属性(也就是上边的 "呆呆君 ")!!!

所以 , 当在外界想更改实例内部的私有变量时 ,结果它不是去更改,而是新添加了一个实例变量,定义在实例里,所以不要被假象迷惑到!

(2)如果在外界直接去访问实例中的私有变量时,将会报错,因为这个变量根本不存在!!!

(3)在外界如果想要添加私有变量,将不会被添加上去,python中不会将它当做私有变量,只会被当做普通的变量!!!

(4)但是严格来说,私有变量也是能读取到的,通过上边打印的结果可以看出,通过_Person__name是可以取到的,但是不推荐,我们应该遵守规则!!!

class Person():
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
p = Person('lxc',20)
print(p._Person__name) # 'lxc'

总结下:

上边说了一大堆,用一句话来概括就是:

当在类中定义的私有变量或方法 python内部会把其名字改成 _类名__私有变量名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值