假期第(23)天
类成员的访问保护机制示例-1
【
04P10.py】
>>> class Test:
def __init__(self):
self.a='A'
self._b='B'
self.__c='C'
def f1(self):
print("f1")
def _f2(self):
print("f2")
def __f3(self):
print("f3")
>>> class _:
def __init__(self, v):
self.__value = v
类的成员1
1
1
1
类成员的访问保护机制示例-2
>>> t=Test()
>>> print(t.a)
A
>>> print(t._b)
#保护数据成员外部可访问
B
>>> print(t._Test__c) #访问私有数据成员,注意形式转换
C
>>> t.f1()
f1
>>> t._f2()
#保护成员方法外部可访问
f2
>>> t._Test__f3()
#访问私有数据成员,注意形式转换
f3
>>> dd = _(5)
>
换>> print(dd.__value) #访问私有数据成员,注意此时形式未转
5
类的成员1
12
2
圆点.的注意事项
l 一个圆点"."是成员访问运算符,可以用来访问命名
空间、模块或对象中的成员,在IDLE、
Eclipse+PyDev、WingIDE、PyCharm或其他Python开
发环境中,在对象或类名后面加上一个圆点".",都
会自动列出其所有公开成员。而如果在圆点"."后面
再加一个下划线,则会列出该对象或类的所有成员,
包括私有成员
类的成员1
13
3
对象数据成员与类数据成员
【
04P13.py】
l 属于对象的数据成员一般在构造方法__init__()中定义,
当然也可以在其他成员方法中定义,在定义和在实例方
法中访问数据成员时以self作为前缀
l 属于类的数据成员是该类所有对象共享的,不属于任何
一个对象,类数据成员定义一般不在成员方法中
l 在类的外部,对象数据成员属于实例(对象),只能通过
对象名访问;而类数据成员属于类,可以通过类名或对
象名访问,以对象名形式赋值则构建动态对象数据成员
>>> class AAA():
aaa = 10
#类数据成员
>>> obj1 = AAA()
#情形1
>>> obj2 = AAA()
>>> print(obj1.aaa, obj2.aaa, AAA.aaa)
10 10 10
>>> obj1.aaa += 2
#情形2
>>> AAA.aaa += 3
>>> print(obj1.aaa, obj2.aaa, AAA.aaa)
12 13 13
类的成员1
14
4
动态增加数据成员示例【
04P14.py】
class Test:
mode1='Mode'
def __init__(self):
self.name='notus'
def ask(self):
Test.mode2='auto'
print(Test.mode1)
##print(Test.mode2) #类数据成员mode2未定义
##print(Test.name)
#name为对象数据成员,且
对
象
未实例化
t=Test()
print(Test.mode1)
print(t.name)
##print(t.mode2)
#类属性mode2未定义
t.ask()
print(Test.mode2)
#已定义,动态增加类数据成员mode2
print(t.mode2)
t.mode1="liulijia"
#动态增加对象数据成员mode2
print(Test.mode1)
print(t.mode1)
d
e
l
t
.
m
od
e
1
p
r
i
n
t
(
t.m
o
d
e1)
类的成
员
输出结果:
Mode
Mode
notus
auto
auto
Mode
liu
lij
ia
Mode1
5
15
类数据成员应用示例【
04P15.py】
l 利用类数据成员的共享性可实时获得该类的对象数量
>>> class Demo:
total =0
def __new__(cls, *args, **kwargs):
#方法 __new__()在__init__()前被调用
try:
if cls.total >= 3: #最多允许创建3个对象
raise Exception('最多只能创建3个对象')#raise触发异常
else:
return object.__new__(cls)
except Exception:
print('不能创建第4个对象')
def __init__(self):
Demo.total = Demo.total + 1
类的成员1
6
16
成员方法与函数的区别【
04P16.py】
l 方法
一般指与特定实例绑定,通过对象调用方法时,
对
象
本
身
(或
类
)将
被
作
为
首
参
数被自动传递。普通函
数并不具备这个特点,必须显示传递自身对象参数
l
c
la
ss
D
em
o:
l pass
l t = Demo()
l def test(self, v):
l self.value = v
l t.test = test #动态增加普通函数
l print(t.test)
l t.test(t, 3) #需要为self传递参数
l print(t.value)
l import types
l t.test = types.MethodType(test, t) #动态增加绑定的方法
l print(t.test)
l t.test(5) #不需要为self传递参数
l print(t.value)

浙公网安备 33010602011771号