内置函数,反射,内置方法

1,内置函数,1>isinstance()  2>issubclass()

  • 1.1>isinstance(),是判断对象所属类型,包括继承关系
  • isinstance(obiect,type)判断对象object是不是某某类型
class A:
    pass
class B(A):
    pass
b = B()  # print(isinstance(b,B)),判断对象b是不是属于B类(b是子类B实例化的对象,那肯定是)
  • 1.2>issubclass(),是判断类与类之间的继承关系(即判断这2个之间是不是存在继承关系),得出的结果是True或者False
    • print(issubclass(B,A)).......................判断类B是不是继承类A,这时返回的是True
    • print(b,A)........................................此时报错,因为对象b和A没有继承关系,和B也不是继承关系
  • 1.3>isinstance和is的区别
class Mystr(str):  #此时打印的是实例化对象空间里放了个"alex"
    pass


ms = Mystr("alex")
print(ms)  # 此时打印的是实例化对象空间里放了个"alex"
print(type(ms) is str)  # type(ms)是指向对象子类的空间(内存地址)
print(isinstance("alex", str))  # 判断"alex"是父类str

2,反射:用字符串数据类型的变量来访问这个变量,反射的方法:getatter  hasatter   setatter    delatter

  • 格式:  命名空间.xxx == getatter(命名空间,"xxx")
class Student:
    ROLE = "STUDENT"

    @classmethod
    def check_course(cls):
        print("查看课程")

    @staticmethod
    def login():
        print("登录")
  • 2.1>反射查看属性(通过类名去调用)
    • print(Student.ROLE)....................................普通查看类中静态属性的方法
    • print(getatter(Student,"STUDENT"))..................用getattr去查看静态属性的方法
  • 2.2>反射调用方法
    • Student.login()..........................普通调用方法
    • getattr(Student,"login")().........................使用getattr调用类中的函数
  • 2.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")()  #使用getattr放法访问类中的方法

反射:

hasattr,getattr

类名,名字

  getattr(类名,"名字")

对象名,名字

  getattr(类名,"名字")

模块名,名字

  import   模块

  getattr(模块,名字)

自己文件,名字

  import  sys

  getattr(sys.modules["main"],"名字")

3,内置方法

  • 类中的特殊方法内置方法
  • 双下方法/魔术方法
  • 类中的每一个双下方法都有它特殊的意义
  • 3.1>__call__方法相当于  对象()
class A :
    def __call__(self, *args, **kwargs):
        print("执行call方法了")

    def call(self):
        print("执行call方法")
class B:
    def __init__(self, cls):
        print("在实例化之前做了一些事")
        self.a = cls()
        self.a()
        print("在实例化之后做了一些事")
a = A()  # 实例化一个对象在后边加一个()就自动执行__call__方法:执行call方法了
a()  # 调用call方法
B(A)  # 实例化B类形成一个对象,把父类(A)的空间传给B类中的cls执行__init__方法
  • 3.2>__len__方法:内置函数和类的内置方法是有联系的,__len__是查找
class Mylist:
    def __init__(self):
        self.lst = [1,2,3,4,5,6]
        self.age = 83
        self.name = name
    def __len__(self):
        print("执行__len__了")
        return len(self.__dict__)
# 这的self.__dict__是查找对象中封装了几个属性,当换成self.lst时,
# 就计算对象封装属性lst的长度,当后边跟一个self.name是查找name这个字符串的长度
l = Mylist()
print(len(l))
  • 3.3>__new__方法(构造方法),     __init__方法(初始化方法)
class Single:
    def __new__(cls,*args,**kwargs)
        print("在new方法里")
        obj = object.__new__(cls)
        print("在new方法里",obj)
        return obj
    def __init__(self):
        print("在init方法里",self)

    • 3.3.1>在内存开辟一个空间,是属于对象的
    • 3.3.2>把对象的空间传给self,执行init
    • 3.3.3>将这个对象的空间返回给调用者
    • 3.3.4>在实例化一个对象,在__init__之前执行__new__方法来创建一块空间
  • 单类:如果一个类,从头到尾只能有一个实例,说明从头到尾就开辟了一块空间(有且只有一个空间),name这个类就是单例类
  • 单例类:
class Single:
    __ISINSTANCE = None
    def __new__(cls,*args,**kwargs):
        if not cls__ISINSTANCE:
            cls.__ISINSTANCE = object.__new__(cls)
            return cls.__new__ISINSTANCE
    def __init__(self,name,age):
        self.name = name 
        self.age = age
        s1 = Single("alex",18)
        s2 = Single("taibai",40)
        print(s1.name)
        print(s2.name)
        print(s1,s2)

  • 第一次输进去的"alex"被"taibai"覆盖掉了
  • 3.4>__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')
huang = Student('huangdongyang','py14')
print('学生1 : %s'%he)  #
# 内置的数据类型,内置的类,相当于执行__str__
# print一个对象相当于调用一个对象的__str__方法
# str(obj),相当于执行obj.__str__方法
# '%s'%obj,相当于执行obj.__str__方法

 

 
原文地址:https://www.cnblogs.com/ljc-0923/p/9398669.html