Python学习札记(三十四) 面向对象编程 Object Oriented Program 5

参考:获取对象信息

NOTE

1.type()函数可以用来判断对象的类型:

>>> type(123)
<class 'int'>
>>> type('ABC')
<class 'str'>
>>> type(None)
<class 'NoneType'>
>>> type(abs)
<class 'builtin_function_or_method'>

如果一个变量指向函数或者类,也可以用type()判断.

也可以用来判断两个变量的类型是否相等:

>>> type(abs)==type(123)
False
>>> type('B')==type('H')
True

判断一个对象是否为函数:

>>> import types
>>> def f():
...     pass
... 
>>> type(f)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True

2.isinstance():可以用来判断一个对象是否是某一个类的对象

#!/usr/bin/env python3

class Animal(object):
    """docstring for Animal"""
    def __init__(self):
        self.name = 'animal'
    def run(self):
        print('animal run')
    def getname(self):
        print(self.name)

class Dog(Animal):
    """docstring for Dog"""
    def __init__(self):
        self.name = 'Dog'
    def run(self):
        print('dog run')
    def getname(self):
        print(self.name)

def main():
    a = Animal()
    b = Dog()

    if isinstance(a, Animal):
        print('a is animal')
    if isinstance(b, Animal):
        print('b is animal')
    if isinstance(a, Dog):
        print('a is dog')
    if isinstance(b, Dog):
        print('b is dog')

if __name__ == '__main__':
    main()
sh-3.2# ./oop5.py 
a is animal
b is animal
b is dog

能够用type()函数判断的类型,也可以用isinstance()判断。

3.如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list:

>>> dir('A')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法。

len('ABC') <=> 'ABC'.__len__()

4.配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态.

#!/usr/bin/env python3

class MyClass(object):
    """docstring for MyClass"""
    def __init__(self, name):
        super(MyClass, self).__init__()
        self.name = name
    def getname(self):
        print(self.name)

def main():
    me = MyClass('chen')
    me.getname()

    # get object attribute

    if hasattr(me, 'name'):
        print('me have attr name')
        getattr(me, 'name')
    if hasattr(me, 'age'):
        print('me have attr age')
        getattr(me, 'age')
    print('first judge finished')
    
    setattr(me, 'age', 20)

    if hasattr(me, 'age'):
        print('me have attr age')
        getattr(me, 'age')
    print('second judge finished')

    # get object function
    f = getattr(me, 'getname')
    f()

if __name__ == '__main__':
    main()

注意,在这三个函数中,提供的均为属性名称。

sh-3.2# ./oop6.py 
chen
me have attr name
first judge finished
me have attr age
second judge finished
chen

2017/2/27

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值