Python面向对象(特殊成员及内置函数)

isinstance与issubclass

#isinstance判断是否属于这个类或者是否有血缘关系

class A:pass

class B(A):pass

obj = B()

print(isinstance(obj,B))  

print(isinstance(obj,A))

#issubclass判断第一个类是否是第二个类的后代

class A:pass

class B(A):pass

obj = B()

print(issubclass(B,A))

print(issubclass(A,B))

反射

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

四个可以实现自省的函数

反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员。

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

对实例化对象的示例

class Foo:

    f = '类的静态变量'

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def AA(self):

        print('hello,%s' %self.name)

obj = Foo('egon',74)

#检测是否含有某属性

print(hasattr(obj,'name'))

print(hasattr(obj,'AA'))

#获取属性

n = getattr(obj,'name')

print(n)

p = getattr(obj,'AA')

p()

print(getattr(obj,'AA','不存在'))

print(getattr(obj,'DSADSDSA','不存在'))

#设置属性

setattr(obj,'sb',True)

print(obj.__dict__)

setattr(obj,'show_name',lambda self:self.name+'sb')

print(obj.__dict__)

print(obj.show_name(obj))

#删除属性

delattr(obj,'age')

delattr(obj,'show_name')

delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

对类的示例

class Foo(object):

    static = 'baidu'

    def __init__(self):

        self.name = 'yanghao'

    def func(self):

        return 'func'

    @staticmethod

    def bar():

        return 'bar'

print(getattr(Foo,'static'))

print(getattr(Foo,'func'))

print(getattr(Foo,'bar'))

对当前模块的示例

import sys

def A1() :

    print('A1')

def A2():

    print('A2')

this_module = sys.modules[__name__]

hasattr(this_module,'A1')

getattr(this_module,'A2')

__len__

class A:

    def __init__(self):

        self.a = 1

        self.b = 2

    def __len__(self):

        return len(self.__dict__)

a = A()

print(len(a))

__hash__

class A:

    def __init__(self):

        self.a = 1

        self.b = 2

    def __hash__(self):

        return hash(str(self.a)+str(self.b))

a = A()

print(hash(a))

__str__

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class A:

    def __init__(self):

        pass

    def __str__(self):

        return '杨灏'

a = A()

print(a)

print('%s'%a)

__repr__

如果一个类中定义了__repr__方法,那么在repr(对象) 时,默认输出该方法的返回值。

class A:

    def __init__(self):

        pass

    def __repr__(self):

        return '杨灏'

a = A()

print(repr(a))

print('%r'%a)

__call__

对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo():

    def __init__(self):

        pass

    def __call__(self, *args, **kwargs):

        print('yanghao')


obj = Foo()  #执行__init__

obj()       #执行__call__

__eq__

class A:

    def __init__(self):

        self.a = 1

        self.b = 2

    def __eq__(self, other):

        if self.a == other.a and self.b == other.b:

            return True

a = A()

b = A()

print(a == b)

__del__(知道即可)

析构方法,当对象在内存中被释放时,自动触发执行。 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

__new__

class A:

    def __init__(self):

        self.x = 1

        print('in init function')

    def __new__(cls, *args, **kwargs):

        print('in new function')

        return object.__new__(A, *args, **kwargs)

a = A()

print(a.x)

#单例模式

class A:

    __instance = None

    def __new__(cls, *args, **kwargs):

        if cls.__instance is None:

            obj = object.__new__(cls)

            cls.__instance = obj

        return cls.__instance

item系列

class Foo:

    def __init__(self,name):

        self.name=name

    def __getitem__(self, item):

        print(self.__dict__[item])

    def __setitem__(self, key, value):

        self.__dict__[key]=value

    def __delitem__(self, key):

        print('del obj[key]时,我执行')

        self.__dict__.pop(key)

    def __delattr__(self, item):

        print('del obj.key时,我执行')

        self.__dict__.pop(item)

f1=Foo('sb')

f1['age']=18

f1['age1']=19

del f1.age1

del f1['age']

f1['name']='alex'

print(f1.__dict__)

 

posted @ 2018-06-26 14:00  杨灏  阅读(368)  评论(0编辑  收藏  举报