1.类中方法属性中的规范形式
- xx : 公有变量
- _x : 开头单下划线, 代表私有化的属性和方法,不能通过from xx import *导入, 都是子类和对象可以访问
- __x : 开头双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(因为外部在使用这个的时候,会吧名字重整所以访问不到)
- __xx__ : 双前后下划线,用户名字空间的魔法对象或属性, 不要自己定义这样的名字
- xx_: 单后置下划线,用于避免与Python关键词的冲突
下面用一段函数来说明:
class Father(object):
def __init__(self, name, age, gender):
# 公有变量, _x私有化属性, __xx
# __xx__前面说了,是类中原有的魔法方法所有不要自己定义, 因此也不用说明
self.name = name
self._age = age
self.__gender = gender
def father_who(self):
print(self.name, self._age, self.__gender)
def _who(self):
print('age is ', self._age)
def __gender(self):
print('gender is %s' %self.__gender)
wang = Father('laowang', '20', 'man')
wang.father_who()
print('=' *20)
wang._who()
wang.__gender()
然后, 我们执行一下,看看结果
laowang 20 man
====================
age is 20
Traceback (most recent call last):
File "/home/python/Desktop/ceishi/main.py", line 22, in <module>
wang.__gender()
AttributeError: 'father' object has no attribute '__gender'Process finished with exit code 1
可以证明开始给出的,:
_age对象是可以访问的
__gender为私有化属性,外部不能访问
下面,我们测试一下,__gender__能不能通过子类访问
class Father(object):
def __init__(self, name, age, gender):
self.name = name
self._age = age
self.__gender = gender
def father_who(self):
print(self.name, self._age, self.__gender)
def _who(self):
print('age is ', self._age)
def __gender(self):
print('gender is %s' %self.__gender)
# 新增加的一个子类去继承上面的父类
class Children(Father):
def set(self, name, age, gender):
self.name = name
self._age = age
self.__gender = gender
def children_who(self):
print(self.name, self._age, self.__gender)
def _who(self):
print('age is ', self._age)
def __gender(self):
print('gender is %s' % self.__gender)
wang2 = Children('xiaowang', '15', 'man')
wang2.father_who()
wang2._who()
wang2.__gender()
我们看一下结果:
xiaowang 15 man
age is 15
Traceback (most recent call last):
File "/home/python/Desktop/ceishi/main.py", line 38, in <module>
wang2.__gender()
AttributeError: 'Children' object has no attribute '__gender'
2. 总结
-
开头双下划线 __xx的, 只能自己使用. 即子类不能继承, 对象不能访问
-
在子类中,向__xx赋值, 会在子类中创建一个相同名字的私有属性
-
名字使用xx是比较好的, 自己不要定义__xx__这样的名字