#-*-encoding:utf-8-*-
class Person():
__counter=0 #类私有属性
#类的属性可在类内初始化,而C++类静态属性需要在类外全局作用域初始化
manager="heihei" #类公有属性
def __init__(self, name, age):
self.name=name
self.__age__=age #实例属性名字为__age在打印obj.__dict__时打印出
#"_Person_age"
Person.__counter+=1 #4、实例方法访问类变量要明确引用类型对象的类
#变量,不能直接用名字访问,否则会LEGB名字查找为实例方法的local变量
def GetName(self):
return self.name
@classmethod
def GetCounterCM(cls):
return cls.__counter #获取类私有属性
obj=Person('pawarotti', 27)
print('key:value of obj:')
for k, v in obj.__dict__.items():
print(k, ' : ', v)
print('-------------1')
print('obj.manager=', obj.manager) #为实例对象新增"实例变量" 'heihei'
'''1、使用实例对象引用类变量其实是为实例对象运行时增加了与类变量名字相同
、值相同的实例变量(还不是实例属性,只是实例对象名字空间中可访问的变量而
不是实例属性,因为如下打印实例对象的属性字典__dict__就没有实例变量
obj.manager),并且只对该实例对象这样做,对其他实例对象没影响。并且修改该
实例对象的这个新增变量也只影响该实例对象,不会影响类变量与其他实例对象
'''
print('key:value of obj:')
for k, v in obj.__dict__.items():
print(k, ' : ', v)
'''7、实例属性并不含新增的"实例变量",即实例对象只是能访问类变量,本质上类
属性是属于类型对象而不是实例对象的'''
print('-----------2')
obj2=Person('mendelssohn', 28)
obj.manager='haha'#修改实例对象的"实例变量"自然不会影响类变量与其他实例对象
print('obj.manager=', obj.manager) #'haha'
print('Person.manager=', Person.manager) #'heihei'
print('obj2.manager=', obj2.manager) #'heihei'
print('------------9')
Person.manager='papa'
print('obj.manager=', obj.manager) #'haha'
'''2、修改类变量,此时对已经覆盖类同名属性的实例对象的实例变量不会有影响
,实例对象的实例变量将屏蔽类型对象的同名属性
'''
print('-----------3')
print('Person.manager=', Person.manager) #'papa'
print('obj.manager=', obj.manager) #'haha'
print('-----------4')
del obj.manager
'''3、删除实例对象的实例变量,则去除了对类同名属性的覆盖,
再用实例对象访问类变量就是重复1、
'''
print('obj.manager=', obj.manager) #'papa'
#print(Person.__counter)
#AttributeError: type object 'Person' has no attribute '__counter'
print('------------5')
print(Person.GetCounterCM())
var0=Person.GetCounterCM()
var0=9
print(Person.GetCounterCM())
'''4、类型对象私有属性在类外不能访问(不能引用),可以用类方法传值获取'''
print('-------------6')
print(obj.__age__) #实例对象私有属性在类外可以访问
print('-------------7')
Person.newvar='learning harder'
print('obj.newva=', obj.newvar) #'learning harder'
'''5、除了可以通过类型对象访问类变量,还可以动态的为类型对象和实例对象添加
类属性'''
funcObj=obj2.GetName #6、实例对象引用实例方法名,返回已经绑定了实例对象
#"self"的实例方法
print('type(funcObj)=', type(funcObj)) #<class 'method'>
print('funcObj()=', funcObj()) #执行funcObj()相当于执行obj2.GetName()
python3.8执行结果:
haypin@ubt:~/Files$ python3.8 m0729.py
key:value of obj:
name : pawarotti
__age__ : 27
-------------1
obj.manager= heihei
key:value of obj:
name : pawarotti
__age__ : 27
-----------2
obj.manager= haha
Person.manager= heihei
obj2.manager= heihei
------------9
obj.manager= haha
-----------3
Person.manager= papa
obj.manager= haha
-----------4
obj.manager= papa
------------5
2
2
-------------6
27
-------------7
obj.newva= learning harder
type(funcObj)= <class 'method'>
funcObj()= mendelssohn
haypin@ubt:~/Files$