zoukankan      html  css  js  c++  java
  • Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)

    一 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
    

    二、反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

    四个实现反射的函数:

    hasattr(object,name:判断object中有没有一个name字符串对应的方法或属性

    getattr(object, name, default=None):获取属性

    setattr(x, 'y', v) :设置属性,is equivalent to ``x.y = v''

    delattr(x, 'y') :删除属性,is equivalent to ``del x.y''

    四个方法使用的演示:

    class BlackMedium:
        feature='Ugly'
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
    
        def sell_house(self):
            print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)
        def rent_house(self):
            print('%s 黑中介租房子啦,傻逼才租呢' %self.name)
    
    b1=BlackMedium('万成置地','回龙观天露园')
    
    #检测是否含有某属性
    print(hasattr(b1,'name'))
    print(hasattr(b1,'sell_house'))
    
    #获取属性
    n=getattr(b1,'name')
    print(n)
    func=getattr(b1,'rent_house')
    func()
    
    # getattr(b1,'aaaaaaaa') #报错
    print(getattr(b1,'aaaaaaaa','不存在啊'))
    
    #设置属性
    setattr(b1,'sb',True)
    setattr(b1,'show_name',lambda self:self.name+'sb')
    print(b1.__dict__)
    print(b1.show_name(b1))
    
    #删除属性
    delattr(b1,'addr')
    delattr(b1,'show_name')
    delattr(b1,'show_name111')#不存在,则报错
    
    print(b1.__dict__)
    
    四个方法的使用演示  

      

    三、__str__

    __str__:定义在类内部的内置的绑定方法,打印的会自动将对象传入

    class Teacher:
        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.courses=[]
    
        def teach(self):
            print('%s teach' %self.name)
    
        def __str__(self):
            return '<name:%s age:%s>' %(self.name,self.age)
    
    class Course:
        def __init__(self,name,price,period):
            self.name=name
            self.price=price
            self.period=period
        def __str__(self):
            return '《name:%s price:%s period:%s》' %(self.name,self.price,self.period)
    
    egon=Teacher('egon',18)
    print(egon) #egon.__str__()
    >>:
    <name:egon age:18>
    
    
    python=Course('python',20000,'6mon')
    openstack=Course('openstack',10,'3mon')
    linux=Course('linux',1,'1mon')
    
    egon.courses.append(python)
    egon.courses.append(openstack)
    egon.courses.append(linux)
    
    # egon.courses.extend([python,openstack,linux])
    print(egon.courses)
    for obj in egon.courses:
      print(obj)


    >>: [<__main__.Course object at 0x0000027F4FF70748>, <__main__.Course object at 0x0000027F4FF70780>, <__main__.Course object at 0x0000027F4FF70710>] 《name:python price:20000 period:6mon》 《name:openstack price:10 period:3mon》 《name:linux price:1 period:1mon》

    四、__del__

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

    import time
    class Foo:
        def __init__(self,x):
            self.x=x
            print('connect mysql') #conn=abcdef('192.168.1.10',3306)
    
        def __del__(self):
            '''做一些与这个对象有关的清理操作'''
            # conn.close()
            # file.close()
            print('====>')
    
    
    f=Foo(10)
    del f   #f.__del__()
    time.sleep(3)
    print('主程序')
    >>:
    connect mysql
    ====>
    主程序
    
    
    f=Foo(10)
    time.sleep(3)
    print('主程序')
    >>:
    connect mysql
    主程序
    ====>
    

     

    五、__item__系列

     

    class Foo:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def __getitem__(self, item):
            # print(self,item,type(item))
            # return getattr(self,item)
            return self.__dict__[item]
        def __setitem__(self, key, value):
            # setattr(self,key,value)
            self.__dict__[key]=value
    
        def __delitem__(self, key):
            # delattr(self,key)
            self.__dict__.pop(key)
    
        def __len__(self):
            return 10
    f=Foo('egon',18,'male')
    print(f.name) #f['name']
    print(f.age) #f['age']
    print(f.sex) #f['sex']
    
    print(f['name'])
    
    f['name']='egon_nb'
    print(f.__dict__)
    del f['name']
    print(f.__dict__)
    print(len(f))


    >>: egon 18 male egon {'name': 'egon_nb', 'age': 18, 'sex': 'male'} {'age': 18, 'sex': 'male'} 10
  • 相关阅读:
    内存可用性判断 IsBadCodePtr IsBadReadPtr 等等
    部署到Linux使用VS Code 开发.NET Core 应用程序
    Gulp.js简介
    net WebApi中使用swagger
    深入理解
    软件框架
    重拾linux
    Linux创建修改删除用户和组
    Linux 之 rsyslog
    Lua 解释器
  • 原文地址:https://www.cnblogs.com/hedeyong/p/7132642.html
Copyright © 2011-2022 走看看