python 类中隐藏属性的4种实现方法

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) 方法 获取值。

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/107951677