zoukankan      html  css  js  c++  java
  • day 22

    classmethod

    翻译:一个类方法

    classmethod是一个装饰器,可以装饰给类内部的方法,使该方法绑定给类来使用

    ​ — 对象的绑定方法特殊之处

    ​ 由对象来调用,会将对象当作第一个参数传给该方法

    ​ — 类的绑定方法特殊之处

    ​ 由类来调用,会将类当作第一个参数传给该方法

    staticmethod

    staticmethod是一个装饰器,可以装饰给类内部的方法,使该方法即不绑定给对象,也不绑定给类

    import hashlib
    import uuid
    import settings
    
    class Teacher:
        def __init__(self,user,pwd):
    		self.user = user
            self.pwd = pwd
            
        # 主页
        def index(self):
            if self.user =='tank' and self.pwd == '123':
                print('验证通过,显示主页...')
        
        @classmethod
        def login_auth_from_settings(cls):
            obj = cls(settings.USER, settings.PWD)
            return obj	# Teacher() --> return = obj
        
        @ staticmethod
        def create_id():
            # 生成一个唯一的id字符串
            uuid_obj = uuid.uuid4()
            md5 = hashlib.md5()
            md5.update(str(uuid_obj)).encode('utf-8')
            return md5.hexdigest()
    

    isinstance与issubclass

    __class__: 对象的属性,获取该对象当前的类

    — isinstance(参数1,参数2)

    ​ python内置的函数,可以传入两个参数,用于判断参数1是否是参数2的一个实例

    ​ *** 判断一个对象是否是一个类的实例

    — issubclass(参数1,参数2)

    ​ python内置的函数,可以传入两个函数,用于判断参数1是否是参数2的子类

    ​ ** 判断一个类是否是另一个类的子类

    class Foo:
        pass
    
    clss Goo(Foo):
        pass
    
    foo_obj = Foo()
    print(isinstance(foo_obj,Foo))
    print(isinstance(foo_obj,Goo))
    print(issubclass(Goo,Foo)
    

    反射

    指的是通过“字符串”对,对象或类的属性进行操作

    ​ — hasattr:通过字符串,判断改字符串或类的属性

    ​ — getattr:: 通过字符串,获取对象或类的属性

    ​ — setattr:通过字符串,设置对象或类的属性

    ​ — delattr:通过字符串,删除对象或类的属性

    '''
    反射小练习
    '''
    
    class Movie:
        def input_cmd(self):
            while True:
                cmd = input('请输入执行的方法名:').strip()
                
                # 若用户输入的cmd命令是当前对象的属性
                if hasattr(self, cmd):
                    method = getattr(self, cmd)
                    method()
                else:
                    print('命令错误,请重新输入!')
        
        def upload(self):
            print('电影开始上传...')
        
        def download(self):
            print('电影开始下载...')
            
           
    movie_obj = Movie()
    movie_obj.input_cmd()
    

    魔法方法

    凡是在类内部定义,以“__开头__结尾”的方法都称之为魔法方法,又称“类的内置方法”

    魔法方法会在某些条件成立时触发

    __init__:在调用类时触发

    __str__:会在打印对象时触发

    __del__:对象被销毁前执行该方法,该方法会在最后执行

    __getattr__:会在对象.属性是,“属性没有”的情况下才会触发

    __setattr__:会在“对象.属性 = 属性值” 时触发

    __call__:会在对象被调用时触发

    __new__:会在__init__执行前触发

    class Foo(object):
        
        def __new__(cls, *args, **kwrags):
            print(cls)
            return object.__new__(cls) # 真正产生一个空对象
        
        # 若当前类的__new__没有return一个空对象时,则不会触发
        def __init__(self):
            print('在调用时触发...')
            
        def __str__(self):
            print('会在打印时触发...')
            # 必须要有一个返回值,该返回值必须是字符串类型
            return '[1,2,3]'
        
        def __del__(self):
            print('对象被销毁前执行该方法...')
            
        def __getattr__(self,itrm):
            print('会在对象.属性时,"属性没有"的情况下才会触发...')
            print(item)
            # 默认返回None, 若想打印属性的结果,必须return一个值
            return 123
        
         # 注意:执行该方法时外部“对象 . 属性 = 属性值”时无效
         def __setattr__(self,key,value):
            print('会在 “对象 . 属性 = 属性值”时触发...')
            print('key,value')
            print(type(self))
            print(self,123)
            self.__dict__[key] = value
            
         def __call__(self, *args, **kwargs):
            print(self)
            print('调用对象时触发该方法...')
                   
    
    class MyFile(object):
        def __init__(self, file_name, mode='r',encoding='utf_8'):
            self.file_name = file_name
            self.mode = mode
            self.encoding = encoding
         
        def file_open(self):
            self.f = open(self.file_name,self.mode,encoding=self.encoding)
            
        def file_read(self):
            res = self.f.read()
            print(f'''
            当前文件名称:{self.file_name}
            当前文件数据:{res}
            ''')
            
           
        def __del__(self):
            self.f.close()
            print('文件关闭成功!')
    

    单例模式

    从配置文件中获取相同的文件名

    class File:
        
        __instance = None
        
        # 单例方式1:
        @classmethod
        def singleton(cls,file_name):
            if not cls.__instance:
                obj = cls(file_name)
                cls.__instance = obj
                return cls.__instance
         
        # 单例方式2:
        def __new__(cls, *args, **kwargs):
            # cls.__new__(cls, *args, **kwargs)
            if not cls.__instance:
                cls.__instance = object.__new__(cls)
                return cls.__instance
           
        def __init__(self,file_name, mode='r', encoding='utf-8'):
            self.file_name = file_name
            self.mode = mode
            self.encoding = encoding
           
        def open(self):
            self.f = open(self.file_name, self.mode, encoding=self.encoding)
           
        def read(self):
            res = self.f.read()
            print(res)
           
        def close(self):
            self.f.close()
    
  • 相关阅读:
    [设计模式]<<设计模式之禅>>关于迪米特法则
    [设计模式]<<设计模式之禅>>关于接口隔离原则
    [设计模式]<<设计模式之禅>>关于依赖倒置原则
    /proc/meminfo分析(一)
    Dynamic DMA mapping Guide
    Linux时钟
    Linux系统休眠和设备中断处理
    Linux调度器
    Linux调度器
    Linux标识进程
  • 原文地址:https://www.cnblogs.com/colacheng0930/p/11662438.html
Copyright © 2011-2022 走看看