• 类的内置方法(用实际代码来验证)


    类的内置方法

    类的双下划线方法:

    __len__    

    #-*- coding:utf-8 -*-
    class Length(object):
        def __init__(self):
            print("xixi")
    
        def __len__(self):
            print("length is 180 cm")
            return 1
    l = Length()
    len(l)
    

     必须会的双下线方法:

     __Str__ & __repr__

    Str函数或者print函数调用是  str

    Repr 或者在终端中使用是使用的就是repr

    如果没有定义str,那么repr会出来代替输出

    这两个方法返回值必须是字符串,否则抛出异常

    class School(object):
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def __repr__(self):
    
            return 'repr'
    
        def __str__(self):
    
            return 'str'
    
    s1 = School('xdd',22,'Man')
    print(repr(s1))
    print(str(s1))
    print(s1)

    __del__ 析构方法  和__init__恰恰相反,init为程序启动时,执行,del为程序关闭时,执行.

     

    class School(object):
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def __del__(self):
            print("process dead")
    
    s = School('jack',22,'W')
    print('aa')
    print('vv')

    NEW方法

    __new__ 方法在 __init__ 方法之前执行

    # -*- coding:utf-8 -*-
    class Printer(object):
        tasks = [] # 存储打印任务的列表
        instance = None
        def __init__(self,name):
            self.name = name
    
        def add_task(self,job):
            self.tasks.append(job)
            print("[%s]添加了[%s]到hp打印机,目前任务数量[%s]"%(self.name,job,len(self.tasks)))
    
        def __new__(cls, *args, **kwargs):
            #只有第一次实例化的时候进行,后边的实例化不会再次创建一个新实例
            if cls.instance is None:# 进行正常的实例化,并把实例化后的对象,存在cls,instance里
                obj = object.__new__(cls)#实例化过程 
                print("obj",obj)
                cls.instance = obj #把实例化好的对象存下来
            return cls.instance #以后的每次实例化都会返回第一次存在的实例对象
    
    
    p1 = Printer("word")
    p2 = Printer("pdf")
    p3 = Printer("execl")
    
    p1.add_task("word data")
    p2.add_task("pdf data")
    p3.add_task("execl data")

    Call方法:__call__    对象后边加括号触发执行

    加上了call方法后

    S = School()

    S() 这样才会执行

    或者使用 School()() 才能执行 

    例子:

    >>> p = Person('Bob', 'male')

    >>> p('Tim')

    My name is Bob...

    My friend is Tim...

    单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。

    Type动态生成一个类

    # -*- coding:utf-8 -*-
    class Person(object):
    
        def __init__(self, name):
            self.name = name
    
    
    p = Person('Alex')
    
    print(type(p))
    print(type(Person))
    
    
    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    
    Class_D = type("Person_Bak",(object,),{'sex':'W',"__init__":__init__})     #通过type动态产生一个类
    print(Class_D)
    
    d = Class_D('jack',22)
    print(d.sex,d.age,d.name)
    print(Class_D)

    Isinstance(obj,cls)

    检查obj是否是类cls的对象

    class Foo(object):

    Pass

    obj = Foo()

    isinstance(obj,Foo)

    Issubclass(sub,super)

    检查sub类是否是super类的派生类

    class Foo(object):

    pass

    class Bar(object):

    pass

    issubclass(Bar,Foo)

  • 相关阅读:
    第四章 开始Unity Shader学习之旅(3)
    第四章 开始Unity Shader学习之旅(2)
    第四章 开始Unity Shader学习之旅(1)
    堆中的变量、对象的使用
    goto语句 switch语句
    C/C++走过的坑(基础问题篇)
    EOF 与 getchar()
    char与 int 类型转化问题汇总
    运算符优先级记忆口诀及列表(转)
    SQL基础篇---函数及其函数配套使用的关键字
  • 原文地址:https://www.cnblogs.com/zjaiccn/p/13220366.html
Copyright © 2020-2023  润新知