在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变量。
面试题
本节暂无面试题