成员修饰、特殊成员
一、类成员修饰符:
- __ 修饰符:
- 公有:均可访问
- 私有:
- 只能内部访问(指通过类自身中的方法去访问)
- 继承也是如此,只能通过自身类中方法访问,不能通过子类中方法访问
- 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('私有 动态方法')
@staticmethoddef __static_func():print('私有 静态方法')
@classmethoddef __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 = nameself.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