python 类的特殊方法
一、常用的特殊方法
1. 初始化__ init __ 方法
称为构造方法,用于构造该类的对象,python通过调用构造方法返回该类的对象(无须使用new),用于初始化python对象
2. 重写__repr__方法
语法格式:
类名[field1=值1, field2=值2,…]
代码如下:
class Apple:
# 实现构造器
def __init__(self, color, weight):
self.color = color;
self.weight = weight;
# 重写__repr__方法,用于实现Apple对象的“自我描述”
def __repr__(self):
return "Apple[color=" + self.color +\
", weight=" + str(self.weight) + "]"
a = Apple("红色" , 5.68)
# 打印Apple对象
print(a)
3. 析构方法:__del __
与_init_()方法对应的是_del_()方法,_ init _ () 方法用于初始化Python对象,而_del_()
则用于销毁Python对象一在任何Python对象将要被系统回收之时,系统都会自动调用该对象的_del_()方法。
4. __dir__方法
对象的_dir_()方法用于列出该对象内部的所有属性(包括方法)名,该方法将会返回包含所有属性(方法)名的序列。
5. __dict__属性
_dict_属性用于査看对象内部存储的所有属性名和属性值组成的字典,通常程序直接使用该属性即可。程序使用_dict_属性既可查看对象的所有内部状态,也可通过字典语法来访问或修改指定属性的值。例如如下程序。
代码如下:
class Item:
def __init__ (self, name, price):
self.name = name
self.price = price
im = Item('鼠标', 28.9)
print(im.__dict__) # ①
# 通过__dict__访问name属性
print(im.__dict__['name'])
# 通过__dict__访问price属性
print(im.__dict__['price'])
im.__dict__['name'] = '键盘'
im.__dict__['price'] = 32.8
print(im.name) # 键盘
print(im.price) # 32.8
6. __ getattr __ 、__setattr__等
当程序操作(包括访问、设置、删除)对象的属性时,Python系统同样会执行该对象特定的方法。
这些方法共涉及如下几个:
_ getattribute _(self, name):当程序访问对象的name属性时被自动调用。
_ getattr _(self, name):当程序访问对象的name属性且该属性不存在时被自动调用。
_ setattr _(self, name, value):当程序对对象的name属性赋值时被自动调用。
_ delattr _(self, name):当程序删除对象的name属性时被自动调用。
代码如下:
class Rectangle:
def __init__ (self, width, height):
self.width = width
self.height = height
def __setattr__(self, name, value):
print('----设置%s属性----' % name)
if name == 'size':
self.width, self.height = value
else:
self.__dict__[name] = value
def __getattr__(self, name):
print('----读取%s属性----' % name)
if name == 'size':
return self.width, self.height
else:
raise AttributeError
def __delattr__(self, name):
print('----删除%s属性----' % name)
if name == 'size':
self.__dict__['width'] = 0
self.__dict__['height'] = 0
rect = Rectangle(3, 4)
print(rect.size)
rect.size = 6, 8
print(rect.width)
del rect.size
print(rect.size)
>> ----设置width属性----
>> ----设置height属性----
>> ----读取size属性----
>> (3, 4)
>> ----设置size属性----
>> ----设置width属性----
>> ----设置height属性----
>> 6
>> ----删除size属性----
>> ----读取size属性----
>> (0, 0)
如果程序需要在读取、设置属性之前进行某种拦截处理(比如检査数据是否合法之类的),也可通过重写_setattr_ ()或_getattribute_方法来实现。
代码如下:
class User:
def __init__ (self, name, age):
self.name = name
self.age = age
# 重写__setattr__()方法对设置的属性值进行检查
def __setattr__ (self, name, value):
# 如果正在设置name属性
if name == 'name':
if 2 < len(value) <= 8:
self.__dict__['name'] = value
else:
raise ValueError('name的长度必须在2~8之间')
elif name == 'age':
if 10 < value < 60:
self.__dict__['age'] = value
else:
raise ValueError('age值必须在10~60之间')
u = User('fkit', 24)
print(u.name)
print(u.age)
#u.name = 'fk' # 引发异常
u.age = 2 # 引发异常
二、与反射相关的属性和方法
1. 动态操作属性(hasattr、getattr、setattr)
在动态检査对象是否包含某些属性(包括方法)相关的函数有如下几个。
判断:hasattr(obj, name):检査/判断obj对象是否包含名为name的属性或方法。
获取:getattr(object, name[, default]):获取object对象中名为name的属性的属性值。
改变/添加:setattr(obj, name, value, /):将 obj 对象的 name 属性设为 value,改变/添加python对象的属性照顾。
代码如下:
class Comment:
def __init__ (self, detail, view_times):
self.detail = detail
self.view_times = view_times
def info ():
print("一条简单的评论,内容是%s" % self.detail)
c = Comment('疯狂Python讲义很不错', 20)
# 判断是否包含指定的属性或方法
print(hasattr(c, 'detail')) # True
print(hasattr(c, 'view_times')) # True
print(hasattr(c, 'info')