一.私有属性的基本用法
1.参考代码:
"""
一、参考:
https://blog.csdn.net/weixin_43790276/article/details/90734040
二、说明:
1.Python中的属性和方法在类的外部默认是可以访问的,而有些属性和方法我们只允许在类的内部使用,不允许在类的外部使用。这种情况下,可以使用类的私有属性和私有方法。
2.私有属性和私有方法都是前面加__。
"""
class Custom(object):
def __init__(self, name, money):
self.name = name
self.__money = money
c = Custom('tom', 100)
print(c.name)
print(c.__money)
2.运行结果:
D:\python37\python.exe E:/xindalu/My_python/jiaoyu/1_私有属性.py
Traceback (most recent call last):
tom
File "E:/xindalu/My_python/jiaoyu/1_私有属性.py", line 16, in <module>
print(c.__money)
AttributeError: 'Custom' object has no attribute '__money'
Process finished with exit code 1
二.外部设置私有属性值和查看私有属性值
1.参考代码:
"""
一、问题:
1.如果有些私有属性已经定义好了,我们又需要在外部知道私有属性的值,怎么办呢?
2.有些属性我们不希望在创建对象时直接传值,因为可能会出现脏数据(比如存款不能是负数),怎么避免呢?
二、解决方法:
我们可以设置一对包含get和set的方法来给外部调用。
三、说明:
1.公有属性可以在类的外部访问和修改,而私有属性只能通过包含set的方法来修改。我们在方法里加了数据判断的逻辑代码,先判断数据的有效性,再将数据赋值给属性,避免脏数据出现。
2.要在外面查看私有属性的值,可以通过包含get的方法来获取。
"""
class Custom(object):
def __init__(self, name):
self.name = name
def get_money(self):
return self.__money
def set_money(self, money):
if money > 0:
self.__money = money
else:
self.__money = 0
print('参数值错误!')
c = Custom('tom')
print(c.name)
c.name = 'TOM'
print(c.name)
c.set_money(-100)
c.set_money(100)
print(c.get_money())
2.运行结果:
D:\python37\python.exe E:/xindalu/My_python/jiaoyu/2_私有属性.py
tom
TOM
参数值错误!
100
Process finished with exit code 0
三.私有方法
1.参考代码:
"""
一、说明:
1.ask_question()方法是普通的方法,在类的外部可以直接调用,__talk_wage()方法是私有方法,只能在类的内部使用,如果在外部写调用的代码则报错。
2.要在外部调用__talk_wage(),只能间接的通过普通方法talk_wage()来调用。
"""
class Interviewer(object):
def __init__(self):
self.wage = 0
def ask_question(self):
print('ask some question!')
def __talk_wage(self):
print('Calculate wage !')
def talk_wage(self):
if self.wage > 20000:
print('too high !')
else:
self.__talk_wage()
print('welcome to join us!')
me = Interviewer()
me.ask_question()
# me.__talk_wage()
me.wage = 30000
me.talk_wage()
print('-' * 20)
me.wage = 15000
me.talk_wage()
2.运行结果:
D:\python37\python.exe E:/xindalu/My_python/jiaoyu/3_私有方法.py
ask some question!
too high !
--------------------
Calculate wage !
welcome to join us!
Process finished with exit code 0
四.私有属性和私有方法的作用和说明
1.私有属性和私有方法只能在类内部使用。
2.定义私有方法和私有属性的目的主要有两个:保护数据或操作的安全性、向使用者隐藏核心开发细节。
3.可以间接的访问私有方法、属性。
虽然私有属性和私有方法不能直接从外部访问和修改,但是通过间接的方法,我们还是获取到了,也修改了。
这说明,在Python类中,没有真正的私有属性和私有方法。
不过,这并不是说私有属性和私有方法没有用,首先,外部不能直接使用了,其次,我们可以在访问私有属性和私有方法的间接方法中做一些必要的验证或干扰,保证数据的安全性,隐藏私有方法的实现细节。
五.私有属性和私有方法不能被子类继承
1.参考代码:
"""
一、说明:
1.父类中的私有属性和私有方法子类无法直接使用,因为子类不会继承父类的私有属性和私有方法。
2.如果想访问,可以通过间接的方式访问。
"""
class Father(object):
def __init__(self):
self.home = 'China'
self.__house = 'house'
def make_money(self):
print('make money')
def __project(self):
print('project work')
class Son(Father):
def work(self):
print('work like a dog!')
s = Son()
print(s.home)
# print(s.__house)
s.work()
s.make_money()
# s.__project()
2.运行结果:
D:\python37\python.exe E:/xindalu/My_python/jiaoyu/4_私有方法和私有属性不能被子类继承.py
China
work like a dog!
make money
Process finished with exit code 0
六.python中下划线说明
1.不带下划线的变量和方法,是普通的变量和方法,在作用域内都可以正常使用,如果是类中定义的属性,则类对象可以在任何地方使用。
2.单前缀下划线“_”的变量和方法,这种变量可以在作用域内正常使用,如果定义在类中,外部可以使用,子类也可以继承。但是,在另一个py文件中通过from aaa import * 导入时,无法导入单下划线“_”开头的变量和方法。
3.双前缀下划线“__”的变量和方法,在作用域内也可以正常使用,如果定义在类中,则是私有属性和私有方法,在外部不能直接访问,子类也不会继承,要访问只能通过间接的方法。在另一个py文件中通过from aaa import * 导入时,也无法导入双下划线“__”开头的变量和方法。
4.单后缀下划线“_”的变量和方法,这种命名方法主要是为了避免与Python关键字冲突而采用的命名方法。
5.双前缀下划线加双后缀下划线“__init__”,这是Python中的魔法属性和魔法方法,都是有特殊含义的和特殊功能的,自己不要轻易定义这样的变量和方法。
七.参考文献
1.https://blog.csdn.net/weixin_43790276/article/details/90734040