文章目录
1、属性名前加上 hidden_:hidden_xxx
# 定义一个矩形的类
class Rectangle:
# 定义初始化方法
def __init__(self,width,height):
self.hidden_width = width
self.hidden_height = height
# 获取 width
def get_width(self):
return self.hidden_width
# 修改 width
def set_width(self,width):
self.hidden_width = width
# 获取 height
def get_height(self):
return self.hidden_height
# 定义修改 height
def set_height(self,height):
self.hidden_height = height
# 计算 矩形面积
def get_area(self):
return self.hidden_width * self.hidden_height
# 创建 Rectangle 的实例
r_one = Rectangle(3,4)
# 输出打印 r_one 的 widh
print(r_one.get_width()) # 输出 3
# 输出打印 r_one 的 area
print(r_one.get_area()) # 输出 12
# 改变 width
r_one.set_width(5)
print(r_one.get_area()) # 输出 20
运行结果:
3
12
20
2、属性名加上双下划线:__xxx
可以为对象的属性使用双下划线开头,__xxx
。
双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问;
其实隐藏属性只不过是 Python自动为属性改了一个名字;
实际上是将名字修改为了,_类名__属性名
, 比如 __name
-> _Person__name
。
class Person:
def __init__(self,name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self , name):
self.__name = name
p = Person('孙悟空')
# 报错:AttributeError: 'Person' object has no attribute '__name'
# __开头的属性是隐藏属性,无法通过对象访问
# print(p.__name)
p.__name = '猪八戒' # 这个设置无效,不会报错。但是下面的输出结果依然是 孙悟空
print(p._Person__name)
p._Person__name = '沙和尚'
print(p.get_name()) # 输入: 沙和尚
运行结果:
孙悟空
沙和尚
3、属性名前加 下划线:_xxx
使用 __
开头的属性,实际上依然可以在外部访问,所以这种方式一般不用;
一般会将一些私有属性(不希望被外部访问的属性)以 _
开头;
一般情况下,使用 _
开头的属性都是私有属性,没有特殊需要不要修改私有属性。
class Person:
def __init__(self,name):
self._name = name
def get_name(self):
return self._name
def set_name(self,name):
self._name = name
p = Person('牛一')
print(p._name)
运行结果:
牛一
4、@property 装饰器
property 装饰器,用于将一个 get 方法,转换为对象的属性
添加为 property 装饰器以后,我们就可以像调用属性一样使用 get 方法
使用 property 装饰的方法,必须和属性名是一样的
class Person:
def __init__(self,name,age):
self._name = name
self._age = age
@property
def name(self):
print('get方法执行了~~~')
return self._name
# setter方法的装饰器: @属性名.setter
@name.setter
def name(self , name):
print('setter方法调用了')
self._name = name
@property
def age(self):
return self._age
@age.setter
def age(self , age):
self._age = age
p = Person('猪八戒',18)
p.name = '孙悟空' # 相当于调用 name 的setter 方法
p.age = 28
print(p.name,p.age) # 相当于调用 name 的 getter 方法
说明:
p.name = '孙悟空'
,表面上是对属性赋值,实际上是 调用 def name(self , name)
方法 进行赋值。
print(p.name)
中的 p.name
, 表面上是获取属性的值 ,实际上是调用 def name(self)
方法 获取值。