面向对象---内置函数,反射,内置方法

一.内置函数

isinstance()  判断对象所属类型,包括继承关系
class A:pass
class B(A):pass
b = B()
print(isinstance(b,B)) #o,t
print(isinstance(b,A)) #o,t
结果为:
True
True
class mystr(str):pass
ms = mystr('alex')
print(ms)
print(type(ms) is str)  # 不包含继承关系,只管一层
print(isinstance('alex',str)) # 包含所有的继承关系
#alex
#False
#True
issubclass()  判断类与类之间的继承关系
class A:pass
class B(A):pass
print(issubclass(B,A))
print(issubclass(A,B))
#True
#False

二.反射

定义:用字符串数据类型的变量名来访问这个变量的值

方法:getattr hasattr setattr delattr

1.类 静态属性 类方法 静态方法

# 命名空间.XXX == getattr(命名空间,'XXX')
class Student:
    ROLE = 'STUDENT'
    @classmethod
    def check_course(cls):
        print('查看课程了')

    @staticmethod
    def login():
        print('登录')
# # 反射查看属性
print(Student.ROLE)
print(getattr(Student,'ROLE'))
>>>
STUDENT
STUDENT

2.反射调用方法

class Student:
    ROLE = 'STUDENT'
    @classmethod
    def check_course(cls):
        print('查看课程了')

    @staticmethod
    def login():
        print('登录')
# # 反射查看属性
print(Student.ROLE)
print(getattr(Student,'ROLE'))
getattr(Student,'check_course')()  # 类方法
getattr(Student,'login')()         # 静态方法
#hasattr
num = input('>>>')
if hasattr(Student,num):
    getattr(Student,num)()
>>>
查看课程了
登录
>>>login
登录

3.对象

方法 对象属性

class A():
    def __init__(self,name):
        self.name = name

    def func(self):
        print('in func')

a = A('alex')
print(a.name)
print(getattr(a,'name'))
getattr(a,'func')()
>>>>
alex
alex
in func

三.模块

os.rename('__init__.py','init')
getattr(os,'rename')('init','__init__.py') # == os.rename
def wahaha():
    print('wahaha')

def qqxing():
    print('qqxing')

import sys
my_file = sys.modules['__main__']

my_file.wahaha()
my_file.qqxing()
getattr(my_file,'wahaha')()
getattr(my_file,'qqxing')()

结果:
wahaha
qqxing
wahaha
qqxing

总结:

反射
hasattr,getattr
类名.名字
    getattr(类名,'名字')
对象名.名字
    getattr(对象,'名字')
模块名.名字
    import 模块
    getattr(模块,'名字')
自己文件.名字
    import sys
    getattr(sys.modules['__main__'],'名字')

四.内置方法

类中的每一个双下方法都有它自己的特殊意义

__call__ 相当于 对象()
__len__  len(obj)
__new__  特别重要   开辟内存空间的 类的构造方法

__call__

class A:
    def __call__(self, *args, **kwargs):
        print('执行call方法了')
    def call(self):
        print('执行call方法了')
class B:
    def __init__(self,cls):
        print('在实例化A之前做一些事情')
        self.a = cls()
        self.a()
        print('在实例化A之后做一些事情')
a = A()
a()  # 对象() == 相当于调用__call__方法
a.call()
#
A()() # 类名()() ,相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
B(A)
结果:

执行call方法了
执行call方法了
执行call方法了
在实例化A之前做一些事情
执行call方法了
在实例化A之后做一些事情

__len__
lass mylist:
    def __init__(self):
        self.lst = [1,2,3,4,5,6]
        self.name = 'alex'
        self.age = 83
    def __len__(self):
        print('执行__len__了')
        return len(self.__dict__)

l = mylist()
print(len(l))
# len(obj)相当于调用了这个obj的__len__方法
# __len__方法return的值就是len函数的返回值
# 如果一个obj对象没有__len__方法,那么len函数会报错
练习:
class My:
    def __init__(self,s):
        self.s = s
    def __len__(self):
        return len(self.s)
my = My('abc')
print(len(my))

单例类:

定义:如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类

class Single:
    __ISINCTANCE = None
    def __new__(cls, *args, **kwargs):
        if not cls.__ISINCTANCE:
            cls.__ISINCTANCE = object.__new__(cls)
        return cls.__ISINCTANCE
    def __init__(self,name,age):
        self.name = name
        self.age = age

s1 = Single('alex',83)
s2 = Single('taibai',40)
print(s1.name)
print(s2.name)
print(s1,s2)
结果:

taibai
taibai
<__main__.Single object at 0x000001B2985D6630> <__main__.Single object at 0x000001B2985D6630>

__str__
class Student:
    def __str__(self):
        return '%s %s %s'%(self.school,self.cls,self.name)

    def __init__(self,name,stu_cls):
        self.school = 'oldboy'
        self.name = name
        self.cls = stu_cls

he = Student('hezewei','py14')
print(he)

print(str(he))   # 内置的数据类型,内置的类,相当于执行__str__
print('学生1 : %s'%he)

# print一个对象相当于调用一个对象的__str__方法
# str(obj),相当于执行obj.__str__方法
# '%s'%obj,相当于执行obj.__str__方法
结果:
oldboy py14 hezewei
oldboy py14 hezewei
学生1 : oldboy py14 hezewei

 




posted @ 2018-07-31 20:30  shuai1993  阅读(222)  评论(0编辑  收藏  举报