Python 私有属性和私有方法应用场景分析

作者:BlackMonkey 时间:2023-12-06 05:36:42 

类的私有属性和方法

Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的public,private 关键字来区分私有公有。

Python默认的成员函数和成员变量都是公开的,类的私有属性指只有在类的内部使用的属性或方法,表现形式为以“__“ 属性名或方法名以双下划线开头。


class Test(object):
 __count = 0  # 私有属性 __count

def get_count(self):
   return self.__count  # 类的内部可以使用私有属性

def set_count(self, value):
   if self.__check_value(value):  # 在类的内部调用类的私有方法
     self.__class__.__count = value

def __check_value(self, value):  # 定义类的私有方法 检查参数
   if isinstance(value, int):
     return True

a = Test()
print(a.get_count())
a.set_count(100)
print(a.get_count())
#a.__check_value(10)  # 调用私有方法会报错
#print(a.__count)# 直接访问私有属性也会报错

应用场景

对于一些敏感的数据,我们不希望直接被的函数调用,或者不希望草率的直接 object.key = value 来修改,我们可以选择将属性声名为私有的,这样从外部时无法访问该属性的,也就不能修改了,但是依然可以修改属性字典的方法来修改。


# 当然 可以使用 @proprety
class Person(object):
 __name = 'Monkey'

def update_name(self, name):
   self.__name = name

def get_name(self):
   return self.__name

p = Person()
p.update_name('BlackMonkey')
print(p.get_name())  # BlackMonkey
print(p.__name)  # 报错 AttributeError: 'Person' object has no attribute '__name'

下面在看下python中私有属性和受保护的属性的实例代码

具体代码如下所示:


class People:

def __init__(self, name, age):
   self.name = name
   self.age = age
   self._protect_var = 10       # 受保护的成员,使用一个下划线_,它仅仅是提示成员受保护,但可以被更改
   self.__private_var = 10       # 使用双下划线__可以定义私有属性

def sayhi(self):
   print("Hi, my name is {}, and I'm {}".format(self.name, self.age))

def get_var(self):
   print(self.__private_var)

def set_var(self, var):
   self.__private_var = var

# class instance 类的实例化

someone = People(name='Jack', age=20)    # 类的实例化
print(someone._protect_var)         # 10 受保护的成员可以被打印
someone._protect_var = 20          # 受保护的成员可以被修改
print(someone._protect_var)         # 20 可以被修改

# print(someone.__private_var)          # 报错 AttributeError: 'People' object has no attribute '__private_var'
someone.__private_var = 30          # 此处可以被修改,不会报错(此处表示私有属性可以被修改,具体原因可以百度)
print(someone.__private_var)         # 可以打印,不会报错

someone.get_var()              # 10 此处可以发现,__private_var在上面被改成30,但此处打印出来却是10(具体原因可以百度)
someone.set_var(40)
someone.get_var()              # 40 这里通过someone.set_var(40)改成了40

print(dir(someone))             # dir()打印出someone这个对象支持的属性和方法
# ['_People__private_var', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__private_var', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_protect_var', 'age', 'get_var', 'name', 'sayhi', 'set_var']
# 在类的内部重命名了 __private_var重命名成_People__private_var

someone._People__private_var = 100
someone.get_var()              # 100 通过_People__private_var把__private_var的值改成了100

来源:https://www.cnblogs.com/monkey-code/archive/2020/06/18/13160629.html

标签:python,私有属性,私有方法
0
投稿

猜你喜欢

  • CentOS6.9+Mysql5.7.18源码安装详细教程

    2024-01-19 02:42:14
  • oracle数据库导入导出命令使用方法

    2023-07-22 19:06:39
  • python3正则提取字符串里的中文实例

    2022-07-01 18:47:45
  • Python 连接字符串(join %)

    2021-01-13 23:30:46
  • 分享我们的select控件设计过程

    2009-06-16 18:04:00
  • python根据txt文本批量创建文件夹

    2021-12-18 21:24:52
  • PyTorch加载预训练模型实例(pretrained)

    2021-02-04 15:26:11
  • Mysql的列修改成行并显示数据的简单实现

    2024-01-24 01:39:54
  • PHP实现定时生成HTML网站首页实例代码

    2023-06-12 05:39:40
  • 详解Python中的Lock和Rlock

    2023-08-11 18:35:20
  • python使用smtplib模块发送邮件

    2023-05-16 22:25:38
  • 基于OpenCV的PHP图像人脸识别技术

    2023-11-23 22:02:54
  • sqlserver、Mysql、Oracle三种数据库的优缺点总结

    2024-01-22 10:33:56
  • ubunt18.04LTS+vscode+anaconda3下的python+C++调试方法

    2023-04-01 16:46:37
  • python爬取微博评论的实例讲解

    2022-01-10 19:53:14
  • 基于Element的组件改造的树形选择器(树形下拉框)

    2024-05-28 16:01:30
  • 深入解答关于Python的11道基本面试题

    2021-11-13 00:34:51
  • Javascript 类型转换方法

    2024-04-10 10:51:21
  • JavaScript声明变量的这四兄弟(var、let、function、const)

    2024-05-09 15:03:05
  • python不等于运算符的具体使用

    2022-03-29 11:21:21
  • asp之家 网络编程 m.aspxhome.com