类可以规范数据的行为,数据有什么样的行为,是人赋予的,因此,类规范的是人的行为。
class Student():
def __init__(self, name, age):
self.name = name
self.age = age
stu = Student('小明', 14)
print(f"{stu.name}今年{stu.age}岁")
stu.age = 1000
print(f"{stu.name}今年{stu.age}岁")
在上面的例子中,我将stu的age属性修改了1000,这显然是不合理的,避免这种情况发生的办法是将age修改为私有属性。
python的面向对象,并没有像其他面向对象语言一样,提供完整严格的访问控制,只是约定用单个下划线开头的属性和方法是私有的。
class Student():
def __init__(self, name, age):
self.name = name
self._age = None
self.set_age(age)
def set_age(self, age):
if age < 7 or age > 20:
raise Exception('年龄不符合要求')
self._age = age
def get_age(self):
return self._age
stu = Student('小明', 14)
print(f"{stu.name}今年{stu.get_age()}岁")
stu.set_age(1000)
print(f"{stu.name}今年{stu.get_age()}岁")
age属性,并没有直接暴露给使用者,而是提供了set_age和get_age两个方法,对age属性的修改和获取都必须通过这两个方法来进行,这样就可以有效的限制使用者错误的使用age属性。
类提供的方法,定义了数据的能力,等价于约定了使用者可操作执行的范围。
当你使用一个开源库时,如果提供给你的是一个类,那么你可以通过这个类的定义,了解到你可以做哪些操作。
通常,好的代码都有规范的描述清晰的注释,通过看源代码,你可以比查阅文档更快的了解如何使用一个开源库,并且挖掘出一些文档里没有介绍的方法。
如果你需要向其他人提供一个类,你需要考虑哪些属性可以被使用者修改,哪些属性不应当对外开放,需要提供哪些方法让使用者来应用。
我反复强调,类是一个约定,约定有哪些数据可以被操作,约定有哪些方法可以使用。
类帮助我们去思考数据本身所具有的内容和形式,类帮助我们与其他人沟通交流,当大家都认可并熟悉这种约定方式后,交流自然顺畅。
何为封装?对数据的管理即是封装。
定义一个类,就是对数据的管理。
属性的定义,是对数据内容的管理。
方法的定义,是对数据行为的管理。
不必在抽象的概念上纠结太久,我强烈建议你从管理的角度来理解编程语言的概念。
封装一个类,目的是去做一件事情,为了做这件事情,需要哪些数据,需要哪些步骤,这些数据就是类的属性,步骤就是类的方法。
类是一种约定,约定了我们要做一件事情需要哪些数据,需要哪些方法,如果方法一词你感觉陌生,我们也可以说,需要哪些能力。
有了数据,有了操作这些数据的能力,就可以做自己想要做的事情,这是一种贴近我们日常思维的思考问题的方式。
QQ交流群: 211426309