class Person:
def __init__(self, name):
# 在类中,可以使用双下划线开头的属性名,来隐藏属性
# 属性或方法一旦添加了双下划线,则此时属性或方法就变成隐藏属性或方法
# 此时它们只能在类内部被访问,无法在外部访问
# 原理:
# 实际上以__开头的属性,在类内部都会进行自动的改名
# 它是将属性名修改为 _类名__属性名
# Person类中的__name属性,就被改为了_Person__name
# self.__name = name
self._name = name
# 但是在开发中,一般情况下不需要使用__开头,所以一般我们的私有化变量都以_开头
# 默认约定添加了_的属性是私有属性,不要去直接修改,需要通过getter或setter来操作
def get_name(self):
return self._name
p1 = Person('Tom')
# print(p1.__name)
print(p1.get_name())
# 创建一个类表示矩形
# class Rectangle:
# def __init__(self,width,height):
# self.width = width
# self.height = height
# self.area = self.width * self.height
# 封装,面向对象的第一个特性
# 封装就是将属性私有化,然后通过getter方法来提供访问属性权限
# 通过setter方法来提供修改属性的权限
# 好处:1.可以单独控制属性的可读和可写
# 2.在修改属性时可以对值进行检查,确保属性值合法
# 3.对于计算属性,可以直接通过方法动态放回,不需要写死
# 封装的好处就是确保了数据的安全性
class Rectangle:
def __init__(self,width,height):
self._width = width
self._height = height
def get_width(self):
return self._width
def set_width(self,width):
if width <= 0:
return
self._width = width
def get_height(self):
return self._height
def set_height(self,height):
if height <= 0:
return
self._height = height
def get_area(self):
return self._width * self._height
r = Rectangle(5,2)
r.set_width(10)
r.set_height(5)
print(r.get_area())