7.17. 类的检测、判断、设置、删除、获取

7.17.1. 用代码来理解

代码示例 1

#!/usr/bin/env python
#-*- coding:utf8 -*-
"""
hasattr:判断一个对象是否有对应字符串方法
getattr:获取方法
setattr:添加方法
delattr:删除方法
"""

def bulk(self):
    '''
    添加的方法
    :return:
    '''
    print("%s is yelling ...." % self.name)


class Dog(object):
    def __init__(self, name):
        self.name = name


    def eat(self, food):
        print("{} is eating.....".format(self.name, food))

    def call(self,call):
        print("{} is wang wang wang ...".format(self.call))

d = Dog("jianli")
choice = str(input(">>:")).strip()

if hasattr(d, choice):       #输入字符串,判断是否有对应的字符串的方法
    func1 = getattr(d, choice)      #获取方法
    func1('')
else:
    setattr(d, choice, bulk) #d.talk = bulk   #通过setattr在类外部添加方法
    func2 = getattr(d, choice)
    func2(d)

print(d.__dict__)

setattr(d,choice,18)
print(d.__dict__)

print("调用delattr删除类中的属性".center(100,"*"))
delattr(d,choice)
print(d.__dict__)

代码示例 2

#!/usr/bin/env python
#-*- coding:utf8 -*-
#hassattr()和setattr()

'''
hasattr(object,name)                       # 测试某个对象是否有某个属性
    object:被测试的对象(类或函数等)
    name:属性名(字符串格式)

setattr(object,name,value)                  # 设置类实例中的某个属性
    object:要设置的对象(类或函数等)
    name:要设置的属性名(字符串格式)
    value:要设置的属性值

gettatr(obj,name[,default])                 # 获得类实例中的某个属性(getattr)
    如果类实例obj中含有name属性,则返回该属性的值,否则看是否有default,如果有,则将该default的值的返回,否则会产生一个
    AttributeError的异常。
'''

class DemoClass:
    class_val = 3
    def __init__(self,x=0,y=0):
        self.x = x
        self.y = y
        self.info()

    def info(self):
        print("类属性class_val:",DemoClass.class_val)
        print("实例属性x:",self.x)
        print("实例属性y:",self.y)

if __name__ == '__main__':
    dc = DemoClass()
    if hasattr(DemoClass,"class_val"):
        setattr(DemoClass,'class_val',1000)   #设置类属性的值
    if hasattr(dc,"x"):
        setattr(dc,"x","xxxxxxxx")            #设置实例设置的值
    if hasattr(dc,"y"):
        setattr(dc,'y','yyyyyyyy')
    dc.info()
    setattr(dc,'z','zzzzzzzzz')             #添加并设置实例属性的值
    print('添加的属性z:', dc.z)