第八章 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')
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值