9 [面向对象]-内置方法

1.isinstance(obj,cls)和issubclass(sub,super)

# isinstance(obj,cls)检查是否obj是否是类 cls 的对象

class Foo(object):
    pass
obj = Foo()
print(isinstance(obj, Foo))


# issubclass(sub, super)检查sub类是否是 super 类的派生类

class Foo(object):
    pass
class Bar(Foo):
    pass
print(issubclass(Bar, Foo))


# 运行结果
True
True

  

2、 item系列:属性操作

  • __setitem__,__getitem__,__delitem__
class Foo:
    def __getitem__(self, item):
        print('getitem..')
        print(item)

    def __setitem__(self, key, value):
        print('setitem')
        print(key,value)

    def __delitem__(self, key):
        print('delitem')
        print(key)

f = Foo()

f['name']           # 查看属性 obj.name
f['name'] = 'alex'  # 设置属性
del f['name']       # 删除属性
>>>>>
getitem..
name
setitem
name alex
delitem
name

  

  (2)例子2

#  item系列

class Foo:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):    # item='name'
        print('getitem..')
        return self.__dict__[item]  # self.__dict__[name]

    def __setitem__(self, key, value):
        print('setitem')
        # print(key,value)
        # self.key = value  # 错误演示 {'name': 'alex', 'key': 'male'}
        self.__dict__[key] = value  # {'name': 'alex', 'sex': 'male'}

    def __delitem__(self, key):
        print('delitem')
        # print(key)
        # del self.__dict__[key]
        self.__dict__.pop(key)

f = Foo('alex')

# 1.查看属性
# obj.属性名
print(f['name'])    # 查看属性obj.name
# print(f['namexxx'])    # 没有namexxx属性


# 2.设置属性
f['sex'] = 'male'  # 添加属性
# f['sex'] = 'male'
print(f.__dict__)
print(f.sex)

# 3.删除属性
# del obj.name
del f['name']
print(f.__dict__)


# 自动触发执行

# 对象可以变成字典对象,可以像字典一样的操作
>>>运行结果
getitem..
alex
setitem
{'name': 'alex', 'sex': 'male'}
male
delitem
{'sex': 'male'}

  

 

3、__str__,__repr__,__format__

# 改变对象的字符串显示__str__,__repr__
# 自定制格式化字符串__format__


# str 方法
d = dict({'name':'alex'})
print(isinstance(d, dict))
print(d)

# str函数或者print函数--->obj.__str__()
# repr或者交互式解释器--->obj.__repr__()
# 如果__str__没有被定义,那么就会使用__repr__来代替输出
# 注意:这俩方法的返回值必须是字符串,否则抛出异常

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        print('===>str')
        return 'aaaa'   # 返回值必须是字符串,否则抛出异常

obj = People('alex', 11)
print(obj)  # 执行obj.__str__()
》运行结果
True
{'name': 'alex'}
===>str
aaaa

  

 

4、__del__

# 析构方法,当对象在内存中被释放时,自动触发执行。
# 注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,
# 如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,
# 比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了__del__。


f = open('settings.py', 'r', encoding='utf-8')
data = f.read()
f.close()  # 回收操作系统的资源
print(data)

# print(f)
# f.read()

 

 

# 析构方法,当对象在内存中被释放时,自动触发执行。

class Open:
    def __init__(self,filename):
        print('open file')
        self.filename = filename

    def __del__(self):
        print('回收操作系统资源:self.close')

f = Open('settings.py')

print('---main---')
                    # 程序结束 执行 del f # f.__del__()

 

>>运行结果
open file
---main---
回收操作系统资源:self.close

  

 5.其他

  博客:http://www.cnblogs.com/linhaifeng/articles/6204014.html

 

posted @ 2018-03-21 16:00  venicid  阅读(243)  评论(0编辑  收藏  举报