Python入门笔记—第十一章【面向对象之OOP(第五部分,类相关函数&成员描述符&成员属性)】

1 类相关函数

- issubclass:检测一个类是否为另一个类的子类

class A():
    pass
class B(A):
    pass
class C():
    pass

print(issubclass(B,A))
print(issubclass(C,A))
print(issubclass(C,object))

结果:

True
False
True

- isinstance:检测一个对象是否是一个类的实例

class A():
    pass

a = A()
print(isinstance(a,A))
print(isinstance(A,A))

结果:

True
False

- hasattr:检测一个对象是否有某个成员

class A():
    name = "xixi"

a = A()
print(hasattr(a,"name"))
print(hasattr(a,"age"))

结果:

True
False

- getattr:get attribution

- getattr(o,name,default)

class A():
    name = "xixi"

#getattr(o,name,default)
a = A()
print(getattr(a,"name"))    #获取属性name的值,默认为"xixi"
#print(getattr(a,"age"))    #不存在属性age,报错
print(getattr(a,"age",19))  #不存在属性age,但是给age设置的默认值19.

结果:

xixi
19

- setattr:set attribution

- setattr(object,name,value)

class A():
    name = "xixi"

a = A()
setattr(a,"name","haha")      #属性name有值,可以使用setattr更改其值
setattr(a,"age",19)           #没有属性age,可以使用setattr设置其属性
print(a.name)
print(a.age)

- delattr:delete attribution

class A():
    name = "xixi"

#delattr(O,name)     

a = A()
#delattr(a,"name") #此处如果删除对象a中的属性name会报错,因为实例化对象a时,并没有将类A中的属性直
                    接存入到对象a中      
delattr(A,"name")
#print(a.name)      #因为已经将属性name删除,再次调用会报错

- dir:获取对象的成员列表

class A():
    name = "xixi"
    age = 18
    address = "NCU"
    def fly(self):
        pass

a = A()
#print(A.__mro__)
print(dir(A))

结果:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'address', 'age', 'fly', 'name']


2 类的成员描述符(属性)

- 类的成员描述符是为了在类中对类的成员属性进行相关操作而创建的一种方式

    - get:获取属性的操作

    - set:修改或添加属性的操作

    - delete:删除属性的操作

- 有三种方法使用类的成员描述符

    - 使用类实现描述器

    - 使用属性修饰符

   - 使用property函数

        - property(fget,fset,fdel,doc)

- property案例:

# peroperty案例
# 定义一个Person类,具有name,age属性
# 对于任意输入的姓名,我们希望都用大写方式保存
# x = property(fget, fset, fdel, doc)
class Person():

    # 函数的名称可以任意,此功能是对变量进行读取操作的时候应该执行的函数功能
    def fget(self):
        return self._name * 2
    #模拟的是对变量进行写操作的时候执行的功能
    def fset(self, name):
        # 所有输入的姓名以大写形式保存
        self._name = name.upper()
    #模拟的是删除变量的时候进行的操作
    def fdel(self):
        self._name = "NoName"

    #property的四个参数顺序的固定的
    #第一个参数代表读取的时候需要调用的函数
    #第二个参数代表写入的时候需要调用的函数
    #第三个是删除
    name = property(fget, fset, fdel, "对name进行大写操作啦")
    
p = Person()
p.name = "dana"
print(p.name)

结果:

DANADANA

注:对这一小节看的似懂非懂,具体可参考http://python.jobbole.com/81967/,过后再补此小节内容


3 类的内置属性

- __dict__:以字典的方式显示类的组成成员

- __doc__:获取类的文档信息

- __name__:获取类的名称,如果在模块中使用,获取模块的名称

- __bases__:获取某个类的父类,以元祖的方式显示

class Person():
    #类的文档信息
    '''
    这是一个人,一个高尚的人,一个脱离了低级趣味的人
    他还他妈的有属性                         
    '''
    # 函数的名称可以任意
    def fget(self):
        return self._name * 2
    
    def fset(self, name):
        # 所有输入的姓名以大写形式保存
        self._name = name.upper()
        
    def fdel(self):
        self._name = "NoName"
    
    name = property(fget, fset, fdel, "对name进行大写操作啦")
    
print(Person.__dict__)
print(Person.__doc__)
print(Person.__name__)
print(Person.__bases__)

结果:

{'__module__': '__main__', '__doc__': '\n    这是一个人,一个高尚的人,一个脱离了低级趣味的人\n    他还他妈的有属性\n    ', 'fget': <function Person.fget at 0x0000000002813488>, 'fset': <function Person.fset at 0x000000000385CB70>, 'fdel': <function Person.fdel at 0x000000000385CBF8>, 'name': <property object at 0x0000000001DE2138>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}

    这是一个人,一个高尚的人,一个脱离了低级趣味的人
    他还他妈的有属性
    
Person
(<class 'object'>,)

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值