Python面向对象编程(Object Oriented Programming,OOP)之访问限制

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

请看下面实例:

class Person:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def do_one(self):
        print("{},{}岁,{},上山去砍柴".format(self.name, self.age, self.sex))

    def do_two(self):
        print("{},{}岁,{},开车去东北".format(self.name, self.age, self.sex))

    def do_three(self):
        print("{},{}岁,{},最爱大保健".format(self.name, self.age, self.sex))


p1 = Person("小明", 10, "男")

p1.do_one()
p1.do_two()
p1.do_three()
print("-----------LINE----------")
p1.age = 25
p1.do_one()
p1.do_two()
p1.do_three()

结果:

小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健
-----------LINE----------
小明,25岁,男,上山去砍柴
小明,25岁,男,开车去东北
小明,25岁,男,最爱大保健

Process finished with exit code 0

再对比下面的实例:

class Person:
    def __init__(self, name, age, sex):
        self.__name = name
        self.__age = age
        self.__sex = sex

    def do_one(self):
        print("{},{}岁,{},上山去砍柴".format(self.__name, self.__age, self.__sex))

    def do_two(self):
        print("{},{}岁,{},开车去东北".format(self.__name, self.__age, self.__sex))

    def do_three(self):
        print("{},{}岁,{},最爱大保健".format(self.__name, self.__age, self.__sex))


p1 = Person("小明", 10, "男")

p1.do_one()
p1.do_two()
p1.do_three()
print("-----------LINE----------")
p1.age = 25
p1.do_one()
p1.do_two()
p1.do_three()

结果:

小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健
-----------LINE----------
小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健

Process finished with exit code 0

细心的同学已经发现了,当我在定义内部属性时在其前面加两条下划线__,你会发现当对外赋值时,无法改变类的中静态变量的值,这是为什么呢,原来我们在编写时候加上__就意味着把它变为了一个私有变量,只有在类的内部可以访问其值,外部无法访问,这就组成了一个私有变量(private variable)。

但是当我设置了私有变量又想要外部访问怎么办?这时,我们就可以在类的内部设置一些公有的方法,因为外部可以访问这些个公有的方法,通过这些公有的方法获得内部私有变量的值。

class Person:
    def __init__(self, name, age, sex):
        self.__name = name
        self.__age = age
        self.__sex = sex

    # 获取name
    def get_name(self):
        return self.__name

    # 获取age
    def get_age(self):
        return self.__age

    # 获取sex
    def get_sex(self):
        return self.__sex

    # 设置name
    def set_name(self, name):
        self.__name = name

    # 设置age
    def set_age(self, age):
        self.__age = age

    # 设置sex
    def set_sex(self, sex):
        self.__sex = sex

    def do_one(self):
        print("{},{}岁,{},上山去砍柴".format(self.__name, self.__age, self.__sex))

    def do_two(self):
        print("{},{}岁,{},开车去东北".format(self.__name, self.__age, self.__sex))

    def do_three(self):
        print("{},{}岁,{},最爱大保健".format(self.__name, self.__age, self.__sex))


p1 = Person("小明", 10, "男")

p1.do_one()
p1.do_two()
p1.do_three()
print("-----------LINE----------")
p1.set_name("小花")
p1.set_age(25)
p1.set_sex("女")
p1.do_one()
p1.do_two()
p1.do_three()

结果:

小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健
-----------LINE----------
小花,25岁,女,上山去砍柴
小花,25岁,女,开车去东北
小花,25岁,女,最爱大保健

Process finished with exit code 0

我们可以把get和set方法多值放在一起:

class Person:
    def __init__(self, name, age, sex):
        self.__name = name
        self.__age = age
        self.__sex = sex

    # 获取 name,age,sex
    def get_value(self):
        return self.__name, self.__age, self.__sex

    # 设置 name,age,sex
    def set_value(self, name, age, sex):
        self.__name = name
        self.__age = age
        self.__sex = sex

    def do_one(self):
        print("{},{}岁,{},上山去砍柴".format(self.__name, self.__age, self.__sex))

    def do_two(self):
        print("{},{}岁,{},开车去东北".format(self.__name, self.__age, self.__sex))

    def do_three(self):
        print("{},{}岁,{},最爱大保健".format(self.__name, self.__age, self.__sex))


p1 = Person("小明", 10, "男")

p1.do_one()
p1.do_two()
p1.do_three()
print("-----------LINE----------")
p1.set_value("小花", 25, "女")
p1.do_one()
p1.do_two()
p1.do_three()
print(p1.get_value())  # 获取多个值得到的是元组

结果:

小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健
-----------LINE----------
小花,25岁,女,上山去砍柴
小花,25岁,女,开车去东北
小花,25岁,女,最爱大保健
('小花', 25, '女')

Process finished with exit code 0

总结:

  • 在Python中,变量名类似__xxx__的,也就是以下划线开口和结尾的,都是特殊变量,特殊变量是可以直接访问的(这里不做演示,喜欢的专研的同学可以考虑测试),不是private变量。所以,不能使用__name__、__age__这样的变量名。
  • 对于__xxx这样的变量,是可以被访问的,但是不能直接访问,可以借助类中公有的方法。
  • 双下下划线开头的变量也不是一定不能从外部访问,Python解释器中__name这样的变量变为了_Person__name,所以可以通过_Person__name来访问__name变量。

面试题

本节暂无面试题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值