zoukankan      html  css  js  c++  java
  • 类的内置方法(用实际代码来验证)

    类的内置方法

    类的双下划线方法:

    __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)

  • 相关阅读:
    浦东新区2019年下半年部分街镇社区工作者和部分单位编外人员公开招聘考试大纲
    苏州 山西
    第几行记录
    命令 检查Linux服务器性能
    SQLRecoverableException: I/O Exception: Connection reset
    Oracle单表备份三种方案
    vim 清空
    常看 Shell: 文本文件操作
    bash date format
    Linux Shell 截取字符串
  • 原文地址:https://www.cnblogs.com/zjaiccn/p/13220366.html
Copyright © 2011-2022 走看看