成员修饰、特殊成员

 

一、类成员修饰符:

  • __ 修饰符:
    • 有:均可访问
    • 私有:
      • 只能内部访问(指通过类自身中的方法去访问)
      • 继承也是如此,只能通过自身类中方法访问,不能通过子类中方法访问
  • example:
    • 私有字段:
class Class1:
__var2 = '静态私有'

def __init__(self,  age):
self.__age = age

def function1(self):
print('动态私有', self.__age)
print('静态私有',Class1.__var2)

# 调用执行
obj = Class1()
obj.function1()   //从类自身方法中,获取任何字段都行
obj.__age           //报错,不能获取私有动态字段
Class1.__var2      //报错,不能获取私有静态字段
 
    • 私有方法:
class Class1:
def __function1(self):
print('私有 动态方法')

@staticmethod
def __static_func():
print('私有 静态方法')

@classmethod
def __class_func(cls):
print('私有 类方法')

def show(self):
self.__function1()
Class1.__static_func()
Class1.__class_func()

# 调用执行
obj = Class1()
obj.show()                 //从自身方法中,调用任何方法都行
obj.__function1()       //报错
Class.__static_func()   //报错
Class.__class_func()    //报错
  • 图解总结:
  • 特例:
    • 不到万不得已,别这样用,忘记他               
class Foo:
def __init__(self,name):
slef.__name = name

def function1(self):
print(self.__name)       

obj = Foo()
obj.__name //此时不能通过外部访问,报错
print(_Foo__name) //可以访问

二、类中的特殊成员:

    • def __del__():
      • 析构方法, 即垃圾清理这个对象前会执行的方法(一个对象长时间没有人调用时候,就由垃圾回收机制自动销毁)
    • __call__(self, *args, **kwargs):
      • obj = Class1()  会执行__init__(self,*args, **kwargs) 方法
        • obj() 会执行__call__ 方法,注意是“对象”后面加括号
        • class()() 先执行__init__后执行__call__
    • __str__()   
      • 若一个对象定义了__str__方法,那么在print(obj_name)时,会自动执行该方法,并输出返回值
class Foo:
def __init__(self,name, age):
slef.name = name
self.age = age

def __str__(self):
return '{}-{}'.format(self.name,self.age)

obj1 = Foo('qiao',18)
print(obj1)

print(ret)          //若class中没有定义str方法,则输出该对象内存地址,若定义str,则输出str方法的返回值
ret = str(obj1)  //str也会调用该对象的__str__方法,不过不会直接输出,只会拿到返回值
    • __dict__ 一个字段,存储了类或对象中所有成员;__dict__默认已经存在
      • obj1.__dict__ 会将对象中所有字段拿出来,放在字典中
      • class.__dict__ 会讲类中所有成员拿出来,放在字典中
    • __add__()
      • 当2个对象执行“相加”操作时,会执行该方法
      • 加减乘除等操作相同,都有对应的方法
class Class1:
def __init__(self,name):
self.name = name

def __add__(self,other):
print('my nam:{}, her age:{}'.format(self.name,other.age))

class Class2:
def __init(self,age):
self.age = age

obj1 = Class1('qiaogy')
obj2 = Class2(18)
obj1+obj2    //会执行obj1的__add__方法,obj2为other



 

posted on 2016-08-29 16:52  台灯不太亮  阅读(137)  评论(0编辑  收藏  举报

导航