Python面向对象中的“私有化”

Python面向对象中的“私有化”

Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机。

为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可。

由双下划线 __ 开始的属性在运行时被“混淆”,所以直接访问是不允许的。

实际上,在 Python 带有双下划线的属性或方法并非正真意义上的私有,它们仍然可以被访问。

在类的内部定义中,所有以双下划线开始的名字都被“翻译”成前面加上单下划线和类名的形式。

示例:

>>> class TestObj(object):
...     __war = "world"
...
...     def __init__(self):
...         self.__har = "hello"
...
...     def __foo(self):
...         print(self.__har + self.__war)
...
...
...
>>> t = TestObj()

>>> dir(t) # 拿到t里面的所有方法
[‘_TestObj__foo‘, ‘_TestObj__har‘, ‘_TestObj__war‘, ‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getat
tribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__
‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]

>>> t.__war
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    t.__war
AttributeError: ‘TestObj‘ object has no attribute ‘__war‘

>>> t.__har
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    t.__har
AttributeError: ‘TestObj‘ object has no attribute ‘__har‘

>>> t.foo()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    t.foo()
AttributeError: ‘TestObj‘ object has no attribute ‘foo‘

>>> t._TestObj__war
‘world‘

>>> t._TestObj__har
‘hello‘

>>> t._TestObj__foo()
helloworld

原文地址:https://www.cnblogs.com/bigtreei/p/9029528.html

时间: 2025-01-11 22:21:25

Python面向对象中的“私有化”的相关文章

python面向对象中的__init__方法怎么理解?

我们在学习python类的时候,总会碰见书上的类中有__init__()这样一个函数,很多同学百思不得其解,其实它就是python的构造方法. 构造方法类似于类似init()这种初始化方法,来初始化新创建对象的状态,在一个对象呗创建以后会立即调用,比如像实例化一个类: f = FooBar() f.init() 使用构造方法就能让它简化成如下形式: f = FooBar() 你可能还没理解到底什么是构造方法,什么是初始化,下面我们再来举个例子: class FooBar: def __init_

47、Python面向对象中的继承有什么特点?

继承的优点: 1.建造系统中的类,避免重复操作. 2.新类经常是基于已经存在的类,这样就可以提升代码的复用程度. 继承的特点: 1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用.有别于C# 2.在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量.区别于在类中调用普通函数时并不需要带上self参数 3.Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找.(先在本类中查找调用的

python面向对象中的一些特殊__方法__

1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息""" def func(self): pass print Foo.__doc__ #输出:类的描述信息 2. __module__ 和  __class__  __module__ 表示当前操作的对象在那个模块 __class__     表示当前操作的对象的类是什么 #!/usr/bin/env python # -*- coding:utf-8 -*- cla

python面向对象中的,变量,方法与属性

1. 类的成员 class Foo: # 方法 def __init__(self,name): # 实例变量/字段 self.name = name # 方法 def func(self): pass # obj,Foo类的对象 # obj,Foo类的实例 obj = Foo('朱奎峰') 成员共分为三类: 变量: - 实例变量(字段) - 公有实例变量(字段) - 私有实例变量(字段) - 类变量(静态字段) - 公有类变量(静态字段) - 私有类变量(静态字段) 实例一: class Fo

python基础19 -------面向对象终结篇(介绍python对象中各种内置命令)

一.isinstance()和issubclass()命令 1.isinstance(对象,类型) 用来判定该对象是不是此类型或者说是该对象是不是此类的对象,返回结果为True和False,如图所示. 注:在python3中类和类型做了统一,都叫做类. 2.issubclass(对象(子类),对象(父类)) 用来判定该对象是不是该父类的子类,返回的结果为True或False,如图所示. 二.反射 1.什么是反射? 反射就相当于程序能检测,访问和修改他本身状态和行为的一种能力,相当于自省. 2.p

python面向对象进阶

isinstance(obj,cls)检查是否obj是否是类 cls 的对象. isinstance(obj,cls)检查是否obj是否是类 cls 的对象. 反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数(参数是对象,字符串格式的属性名) hasattr getattr setattr delattr __del__,就是析构方法,当对象在内存中被释放时,自动触发执行. 注:此方法一般无须定义,

Python面向对象-day07

写在前面 上课第七天,打卡: 时间的高效利用: 前言: 今天egon老师补充了下 is 和 == 的区别,整理如下:Python中变量的属性以及判断方法 一.面向过程和面向对象 - 1.面向过程 核心是过程,过程就是解决问题的步骤:流水线.机械式: 优点:复杂的问题简单化,分成多个功能单元: 缺点:可扩展性差 应用:Linux内核.httpd.git - 2.面向对象 核心是对象: 要理解对象,应该把自己当做上帝,在上帝眼里一切存在的事物都是对象,不存在的也可以创建出来: 对象是 特征(变量)和

Python 面向对象的补充

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class Bar(Foo): 5 pass 6

Python面向对象(三)

一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上一个装饰器@classmethod 二.非绑定方法:既不与类绑定,又不与对象绑定,意味着对象和类都可以来调用,无论谁来调用都是一个普通的函数,普通函数没有自动传值的效果 案例如下: class Foo: def f1(self): print(self) @classmethod def f2(cl