类的属性和方法
在类的内部可以定义属性和方法,而在类的外部则可以直接调用属性或方法来操作数据,从而隐藏了类内部的复杂逻辑。但是Python并没有对属性和方法的访问权限进行限制。为了保证类内部的某些属性和方法不被外部所访问,我们可以将属性或者方法名前面添加_
或者__
来限制访问权限
单_作用:以单下划线开头的表示protected(保护)类型的成员,只允许类本身和子类进行访问,但不能使用from moudule import *
语句进行导入
双__线作用:首尾双下划线表示定义特殊的方法,一遍是系统定义的名字。如__init__()
私有类属性和实例属性的区别及调用
_定义
:
-
类属性
- 通过类名访问:
类名._类属性
- 通过对象访问:
对象._类属性
- 通过类名访问:
-
实例属性
- 通过类名访问:无法通过类名访问,会报错没有这个属性
- 通过对象访问:
对象._实例属性
__定义
: -
类属性
- 通过类名访问:
类名._类名__类属性
- 通过对象访问:
对象._类名__类属性
- 通过类名访问:
-
实例属性
- 通过类名访问:无法通过类名访问,会报错没有这个属性
- 通过对象访问:
对象名_类名__实例属性
class Demo:
# 创建私有类属性a,b,一个用_,一个用__
_a = 10
__b = 20
def __init__(self, name, age):
"""
创建实例属性name,age,一个用_一个用__
:param name: _
:param age: __
"""
self._name = name
self.__age = age
if __name__ == '__main__':
# 创建一个对象
obj = Demo('xiaoming', 18)
# 通过类名访问带 _ 的类属性
print(Demo._a)
# 无法通过类名访问带 _ 的实例属性
# 通过对象访问带 _ 的类属性,对象名.类属性
print(obj._a)
# 通过对象访问带 _ 的类实例属性,对象名.实例属性
print(obj._name)
# 通过类名访问带 __ 的类属性
print(Demo._Demo__b)
# 无法通过类名访问带 __ 的实例属性
# 通过对象访问带 __ 的类属性
print(obj._Demo__b)
# 通过对象访问带 __ 的实例属性
print(obj._Demo__age)
类的私有类方法和实例方法的区别及调用
_定义
:
- 类方法:
- 通过类名访问:
类名._方法名()
- 通过对象访问:
对象._方法名()
- 通过类名访问:
- 实例方法:
- 通过类名访问:无法通过类名访问,会报错没有这个属性
- 通过对象访问:
对象._方法名()
__定义
:
- 类方法:
- 通过类名访问:
类名._类名__类方法()
- 通过对象访问:
对象._类名__类方法()
- 通过类名访问:
- 实例方法:
- 通过类名访问:无法通过类名访问,会报错没有这个属性
- 通过对象访问:
对象._类名__方法名()
class Demo:
def _test1(self):
"""
创建一个带_的实例方法test1
:return:
"""
print('打印一个带_实例方法test1')
def __test2(self):
"""
创建一个带__的实例方法test2
:return:
"""
print('打印两个带__实例方法test2')
@classmethod
def _test3(cls):
"""
创建一个带_的类方法test3
:return:
"""
print('打印一个带_类方法test3')
@classmethod
def __test4(cls):
"""
创建两个带__的类方法test4
:return:
"""
print('打印两个带__类方法test4')
if __name__ == '__main__':
# 创建一个对象
obj = Demo()
# 通过类名访问带 _ 的类方法,类名.方法名()
Demo._test3()
# 无法通过类名访问带 _ 的实例方法
# 通过对象名访问带 _ 的类方法,对象名.类方法()
obj._test3()
# 通过对象名访问带 _ 的类实例方法,对象名.实例属性()
obj._test1()
# 通过类名访问带 __ 的类方法,类名._类名__方法名()
Demo._Demo__test4()
# 无法通过类名访问带 __ 的实例方法
# 通过对象名访问带 __ 的类方法,对象._类名__类方法()
obj._Demo__test4()
# 通过对象名访问带 __ 的实例方法,对象._类名__实例方法()
obj._Demo__test2()
总结:
在Python
类中,我们可以使用_
和__
来定义私有类属性和方法,也可以使用一定的方法来进行调用,对于两种特殊情况,是需要注意的:
- 无法通过类名访问私有的属性
- 无法通过类名访问私有的方法