【python40--类和对象:一些相关的BIF】

0、如何判断一个类是否为另外一个类的子类

--使用issubclass(class,classinfo)函数,如果第一个函数(class)是第二个参数(classinfo)的一个子类,则返回Ture,否则返回False

* 一个类被认为是其自身的子类

* classinfo可以是类对象组成的元组,只要class与其中一个候选类的子类,则返回True

* 在其他情况下,会抛出TypeError异常

>>> class A:
    pass

>>> class B(A):
    pass

>>> issubclass(A,B)
False
>>> issubclass(B,A)
True
>>> 

-----B继承了A,所以issubclass(class,classinfo)
所以 issubclass(B,A)返回的是True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> 

* 一个类是自身的子类
* object是所有类的鸡肋

1、如何判断对象a是否为类A的实例对象?

--使用isinstance(object,classinfo)函数,如果第一个参数(object)是第二个参数(classinfo)的实例对象,则返回True,否则返回False

* 如果第一个参数不是对象,则永远返回False

* 如果第二个参数不是类或者类对象组成的元组,会抛出一个TypeError的异常

* 如果object是classinfo的子类的一个实例,也符合条件

* classinfo可以是类对象组成的元组,只要object是元组内任何一个类的实例化对象,返回True

>>> class A:
    pass

>>> class B(A):
    pass

>>> b1 = B()
>>> isinstance(b1,B)
True
>>> isinstance(b1,A)
True
>>> class C:
    pass

>>> isinstance(b1,C)
False
>>> isinstance(b1,(A,B,C))
True
>>>
---b1是B的实例化对象,由于B类继承于A类,所以b1也是A类的实例化对象,同样都会返回true
---b1不是C的实例化对象,因为C类和A,B类没有任何的关系
---b1是(A,B,C)类元组的实例化对象,原因是class只要是元组中任何一个类的实例化对象,返回的就是Tru

2、如何避免访问对象不存在的属性(不产生异常)?

有两种方法:

*、先使用hasattr(object,name)函数判断属性是否存在,如果存在在访问(第一个参数(object)是对象,第二个参数(name)是属性名的字符串形式

*、直接使用getattr(object,name[,default])函数并设置default参数(返回对象指定的属性值,如果指定的属性不存在,返回default(可选参数)的值)

>>> class D:
    def __init__(self,x=0):
        self.x = x

        
>>> d1 = D()
>>> hasattr(d1,x)
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    hasattr(d1,x)
NameError: name 'x' is not defined
>>> hasattr(d1,'x')
True
>>> 

---属性名称必须是字符型:'x'
>>> getattr(d1,'x')
0
>>> getattr(d1,'y')
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    getattr(d1,'y')
AttributeError: 'D' object has no attribute 'y'
>>> getattr(d1,'y',"当前属性不存在...")
'当前属性不存在...'
>>> 


--getattr()是返回属性的值,如果不存在则会抛出Error,当然可以设置一个默认的值,如:
"当前属性不存在..."

3、setattr(object,name,value)函数 :新建属性并赋值

>>> class D:
    def __init__(self,x=0):
        self.x = x

        
>>> d1 = D()
>>> getattr(d1,'y',"当前属性不存在...")
'当前属性不存在...'
>>> setattr(d1,'y','1')
>>> getattr(d1,'y')
'1'

--没有y属性, 设置了一个y属性并赋值1,再次获取y属性的值得到的是1

4、delattr(object,name)函数:删除对象中指定的属性,若没有此对象则抛出一个Error

>>> delattr(d1,'y')
>>> getattr(d1,'y')
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    getattr(d1,'y')
AttributeError: 'D' object has no attribute 'y'
>>> delattr(d1,'z')
Traceback (most recent call last):
  File "<pyshell#46>", line 1, in <module>
    delattr(d1,'z')
AttributeError: z

--删除了y属性,再次获取y属性时则返回了: 'D' object has no attribute 'y'
--删除一个不存在属性,抛出一个Error错误:AttributeError: z

5、property((fget=None,fset=None,fdel=None,doc=None))函数的作用是什么?

--property函数允许变成人员轻松,有效地管理属性访问

class C:

    def __init__(self,size=10):
        self.size = size

    def getXsize(self):
        return self.size

    def setXsize(self,value):
        self.size = value

    def delXsize(self):
        del self.size

    x = property(getXsize,setXsize,delXsize)

>>> c = C()
>>> c.x
>>> Out[4]: 10
>>> c.x = 12
>>> c.x
>>> Out[6]: 12

一、python的函数修饰符(装饰器)的使用

1、

 

转载于:https://www.cnblogs.com/frankruby/p/9677630.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值