-
2018-11-09 14:28:17
xx:公有变量
_x:单前置下划线,私有化属性或方法,from somemodule import * 禁止导入,类对象和子类可以访问
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
__xx__:双前后下划线,用户名字空间的魔法对象或属性,例如:__int__, __不要自己发明这样的名字
xx_:单后置下划线,用于避免与Python关键词的冲突
通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或属性) 如: _Class__object)机制就可以访问private了
更多相关内容 -
Python 私有属性和私有方法应用场景分析
2020-12-17 09:12:10Python默认的成员函数和成员变量都是公开的,类的私有属性指只有在类的内部使用的属性或方法,表现形式为以“__“ 属性名或方法名以双下划线开头。 class Test(object): __count = 0 # 私有属性 __count def get_... -
Python私有属性私有方法应用实例解析
2020-09-16 07:46:51主要介绍了Python私有属性私有方法应用场景解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
python私有属性和方法实例分析
2021-01-20 04:13:26本文实例分析了python的私有属性和方法。分享给大家供大家参考。具体实现方法如下: python默认的成员函数和成员变量都是公开的,并且没有类似别的语言的public,private等关键词来修饰。 在python中定义私有变量只... -
Python私有属性与私有方法
2022-03-21 10:38:271、 场景定义 私有属性 是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问...在 Python 中定义私有属性和私有方法的语法如下: class Staff: def __init__(self, s_nam.1、 场景定义
私有属性
是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性。
即:私有属性是对象不愿意公开的属性。
私有方法
是指在 Python 的面向对象开发过程中,对象的某些方法或者称为函数只想在对象的内部被使用,但不想在外部被访问到这些方法或函数。
即:私有方法是对象不愿意公开的方法或函数。
2、 语法定义
在 Python 中定义私有属性和私有方法的语法如下:
class Staff:
def __init__(self, s_name, s_salary):
self.s_name = s_name
self.__salary = s_salarydef \_\_secret(self): print("%s 的工资是 %d" % (self.s\_name, self.\_\_salary))
(1). __salary是以两个下划线开头来定义的私有属性。
(2). __secret(self)是以两个下划线开头来定义的私有方法。
3、 调用分析
(1). 在__init__的对象初始化方法中,以两个下划线开头定义的__salary属性就是私有属性。
现在在对象的外部来调用一下__salary属性,看是否能正常访问该私有属性。
从上图运行结果可以看出,第11行,即在对象外部访问对象的私有属性 __salary 时,提示 AttributeError 错误,Staff 对象 zhangsan 没有属性 __salary。
为了证明 Staff 类对象确实是有__salary 这个实例属性的,只是因为在对象外部不能访问私有属性。
我把 self.__salary 修改为:self.salary,__secret(self)方法对self.__salary属性的引用,做相应的修改,看如下图所示的运行结果。
可以从运行结果看出,这种非私有属性在外部的调用是正常的,没有提示 AttributeError 错误。
(2). 在 __secret(self) 实例方法中,以两个下划线开头定义的__secret(self)方法就是私有方法。
和上面测试流程一样,先在对象的外部来调用私有方法__secret(self),看是否能正常调用该私有方法。
从上图运行结果可以看出,第11行,即在对象外部访问对象的私有方法 __secret(self) 时,提示 AttributeError 错误,Staff 对象 zhangsan 没有 __secret 方法。
为了证明 Staff 类对象是有__secret(self)这个实例方法的,只是因为在对象外部不能访问私有方法。
我把 __secret(self) 方法修改为:secret(self),其他代码不变,看如下图所示的运行结果。
可以从运行结果看出,这种非私有方法在外部的调用是正常的,没有提示 AttributeError 错误。
(3). 从下图可以看出,在对象内部私有方法与私有属性是可以被调用的。
如图中的 work 方法调用了私有方法__secret(self),而私有方法__secret(self)调用了私有属性__salary。
在对象外部使用 Staff 类对象 zhangsan 来调用 work 方法,可以间接访问到对象的私有属性和私有方法。
从控制台输出结果来看 work 方法能正常访问到对象内部定义的私有属性和私有方法。
4、 Python伪私有属性和私有方法
在 Python 中,并没有真正意义上的私有,因为 Python 内部在给属性、方法命名时,对名称做了一些特殊处理,使得外界无法访问到对应的属性和方法。
以私有属性和私有方法为例,Python内部处理方式为:
(1). 属性: __salary,经过处理后的属性名为:_Staff__salary(_类名__属性名)
(2). 方法: __secret,经过处理后的方法名为:_Staff__secret(_类名__方法名)
知道了 Python 内部对于私有属性和私有方法的处理,现在使用这种处理后的命名方式来在对象外部访问私有属性和私有方法,看是否能访问正常。
class Staff:
def __init__(self, s_name, s_salary):
self.s_name = s_name
self.__salary = s_salarydef \_\_secret(self): return "%s的工资是 %d" % (self.s\_name, self.\_\_salary)
zhangsan = Staff(“张三”, 10000)
print(zhangsan._Staff__salary)
print(zhangsan._Staff__secret())运行结果如下图所示
控制台没有抛任何的异常,之前的提示 AttributeError 错误也没有了。
这个例子证明了 Python 是没有真正意义上的私有的,当知道了其内部处理方式后,依然可以使用_类名__属性名(方法名)的方法来在对象外部访问到对象内部定义的私有属性和私有方法。
但这种方式在日常工作中是不推荐使用的,既然在对象内部定义属性和方法时,就声明了其为私有的,调用方就需要遵守其规则。
这里只是想通过这个小例子来说明 Python 并无真正意义上的私有。
-
老生常谈python的私有公有属性(必看篇)
2020-12-24 01:39:15__name="私有属性" def func(self): print(C.__name) class sub_C(C): def info(self): print(C.__name)#派生类中不可以访问父类的私有字段 obj=C() obj.func() obj=sub_C() obj.info() 方法、属性的访问于上述... -
python私有属性访问不到吗?
2021-03-05 20:31:39要了解私有属性是否真的访问不到,需要从Python是如何实现私有属性入手。在Python中,会把双下划线的属性变为_ClassName__PropertyName的形式,用代码演示一下:classFoo(object):__bar=123print(Foo._Foo__bar...之前我们讲过了访问限制的三种级别。分别是公有、私有和受保护。那么,私有属性真的不能访问吗?今天我们就来一起测试一下吧。
要了解私有属性是否真的访问不到,需要从Python是如何实现私有属性入手。在Python中,会把双下划线的属性变为_ClassName__PropertyName的形式,用代码演示一下:class Foo(object):
__bar = 123
print(Foo._Foo__bar) # 123
运行一下可以知道,正常输出了__bar的值,但是不推荐这样去访问私有属性,因为不同的Python解释器对于私有属性的处理不一样。
特例
使用双下划线定义私有属性,有一种特殊情况,当属性后也有两个下划线的时候,这个属性会被Python解释器当做魔术方法,从而不做私有处理。class Foo(object):
__bar__ = 123
print(Foo.__bar__) # 123
上面代码输出了123,证明Python解释器并没有把__bar__当做私有属性。当定义私有属性时,需要注意名字最后最多只能有一个下划线。
另一个特例
假如定义的属性名就叫__呢?不妨直接试一下:class Foo(object):
__ = 123
print(Foo.__) # 123
可以发现名字叫__的属性也不会被认为是私有属性,名字是多个下划线的属性也不是私有属性(比如_______)。
以上就是python私有属性访问的一些测试。更多Python学习推荐:云海天Python教程网。
-
python私有属性可以被子类继承吗_python面向对象--私有和继承
2020-11-30 12:45:23一、 私有属性和私有方法应用场景在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到私有属性 就是 对象 不希望公开的属性 (属性即类里面的变量)私有方法 就是 方法 不希望...一、 私有属性和私有方法
应用场景
在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到
私有属性 就是 对象 不希望公开的属性 (属性即类里面的变量)
私有方法 就是 方法 不希望公开的方法
定义方式
在定义属性或方法时,在属性名或者方法名前添加两个下划线,定义的就是私有属性或方法,只能在类里面用。
classMy:deftest(self):
self.__password = 123456 #私有属性
defsay(self):print('password',self.__password)def __set_password(self): #私有方法
self.__password = 7890
defupdate(self):
self.__set_password()
m=My()
m.test()#无输出结果
m.say() #输出:password 123456
m.update() #无输出结果
m.say() #输出:password 7890
参考:https://www.2cto.com/os/201807/763010.html
二、继承
子类继承自父类,可以直接享受父类中已经找到封装好的方法
子类中应该根据自己的需求,封装子类特有的属性和方法
单继承
1,继承的概念 语法和特点
继承的概念:子类拥有父类的所有方法和属性(子类只需封装自己特有的方法和属性)
2,继承的语法
class 类名(父类)
def 子类特有的方法
classLm:
money= 1000000house= 5
defdriver(self):print('会开车')classMcb(Lm):defabout_me(self):print('我有 %s 钱 ,%s 房子'%(self.money,self.house))
self.driver()defdriver(self):print('会开28个轮子的汽车')
m=Mcb()
m.driver()#输出:会开28个轮子的汽车
m.about_me()
#以上代码输出:
会开28个轮子的汽车
我有1000000 钱 ,5房子
会开28个轮子的汽车
3. super().方法名():在父类某个方法的基础上增加新功能
class Car: #父类
defrun(self):print('running...')return 'abc'
class NewCar(Car): #子类
defrun(self):#沿用父类中的功能的同时,再增加下面的新功能
res =super().run() #super()的意思就是找到父类,等同于Car().run()
print('fly...') #增加的父类中没有的功能
print(res)
bmw=NewCar()
bmw.run()
#以上代码输出结果如下:
running...
fly...
abc
继承的传递性:(爷爷 父亲 儿子)
1,C类从B类继承,B类又从A类继承
2,那么C类就具有B类和A类的所有的属性和方法
子类拥有父类以及父类的父类中封装的所有的属性和方法
参考:https://www.2cto.com/os/201807/763010.html
-
Python可变和不可变、类的私有属性实例分析 python私有属性可以继承吗
2021-02-04 08:09:47= 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ): self.name = list( self.name ) 就可以了.python 类中的私有属性有哪些类的私有属性: __private_attrs:两... -
python私有属性供外界访问的三种方法(面向对象 封装)
2022-01-21 20:01:11访问私有属性可以用这个方法,但在使用过程中需要频繁的调用自定义方法 比如说:想更改一次年龄时,就需要u1.set_age("年龄") #定义两个私有属性age,gender #1.get()方法-------定义对私有属性的get方法,获取私有... -
Python 私有属性也可以在外部访问?
2020-12-17 23:31:11私有属性就是对象不希望公开的属性。私有方法就是对象不希望公开的方法。在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法。示例:class Women:def __init__(self, name):self.... -
python私有属性和私有方法
2020-11-24 22:39:36私有属性和私有方法 在属性名或者方法名前面增加两个下划线,定义的就是私有属性或者私有方法。 class Women: def __init__(self, name): self.name = name self.__age = 18 def secret(self): print("%s的... -
Python 私有属性和私有方法
2019-10-09 00:53:02私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 __secr... -
Python私有属性、私有方法,子类不能继承父类的私有属性和私有方法,修改私有属性的值 ,类属性,静态方法...
2021-10-07 16:24:031、私有属性 这个我们可以实例化对象来拿到name属性的值的 我们看到用实例化对象来获取__age属性的值是获取不到的,那个12是我在本类中输出的,可以在本类中使用 私有方法 1.1、我们无法从外部来调用__da这... -
Python私有属性和受保护的属性原理解析
2020-08-05 14:18:23Python不能像Java那样使用 private 和protected 修饰符创建私有属性和受保护的属性,但是Python有个简单的机制,能避免子类意外覆盖“私有”属性。 首先定义一个Dog类: class Dog: 'Dog class' def __init__... -
python 私有属性和受保护属性
2019-09-03 10:15:05什么是私有属性 在类中定义的属性不提供给外部使用,在定义该属性时,属性名前加__代表该属性为私有属性。 例子: x为公有属性,外部可是访问该值。 y为私有属性,外部不能访问该值. class A: def __init__(self, ... -
python私有属性单、双下划线区别
2022-03-20 10:41:06目录1、单下划线与双下划线外部调用区别2、父类与子类的双下划线私有属性外部调用时区别3、super方法继承父类,验证生成属性与方法的顺序4、类属性、私有属性的内存存储 私有属性是将变量作为私有的来使用: 单... -
python私有属性和公有属性
2019-05-27 01:09:15在面向对象(Object Oriented Design)的情景下,所谓私有属性(private attributes),包括私有方法和私有变量,指的是只供一个类或者实例内部使用的方法和变量。这些方法和变量不应当被在类和实例的外部调用。然而,在... -
python私有属性及方法
2022-04-16 17:11:42私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问; 私有属性 和 ... -
python 私有属性和方法
2020-11-25 22:20:05python默认的成员函数和成员变量都是公开的,python 私有属性和方法没有类似别的语言的public,private等关键词来修饰。 在python中定义私有变量只需要在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就... -
python私有属性及私有方法
2019-02-05 20:55:10简介: 在其它高级编程语言,如Java、C++等...而在python中,也支持对私有属性及私有方法的控制。 设置私有属性及私有方法: class People: # 初始化参数 def __init__(self, name): self.name = name self... -
Python私有属性和私有方法
2020-11-21 02:28:00私有属性和私有方法01. 应用场景及定义方式应用场景在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到私有属性 就是 对象 不希望公开的 属性私有方法 就是 对象 不希望... -
python私有属性和方法
2022-03-03 09:16:15私有属性:不希望对外界公开的属性 私有方法:不希望对外界公开的方法 """ class Women: def __init__(self, name): self.name = name self.__age = 18 # 私有属性(__属性名),在属性前加两条下划线 def _... -
Python私有属性(private attributes)及其调用
2019-01-05 00:17:07Python中的私有属性 在面向对象(Object Oriented Design)的情景下,所谓私有属性(private attributes),包括私有方法和私有变量,指的是只供一个类或者实例内部使用的方法和变量。这些方法和变量不应当被在类和实例... -
一文搞懂 Python 私有属性 & 私有方法
2022-06-12 16:14:291. 场景定义私有属性是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性。即:私有属性是对象不愿意公开的属性。私有方法是指在 Python 的面向对象开发过程...