python-自定义@修饰符

枫铃3年前 (2021-07-23)Python236

__new__函数

在实例化开始之后,在调用 __init__()方法之前,Python 首先调用 __new__() 方法

#单例1
class Singleton1(object):
    _inst=None
    # 在实例化开始之后,在调用 __init__() 方法之前,Python 首先调用 __new__() 方法
    def __new__(cls,*args, **kwargs):
        if cls._inst is None:
            # 如果要得到当前类的实例,应当在当前类中的 __new__() 方法语句中调用当前类的父类的 __new__() 方法
            cls._inst = super(Singleton1, cls).__new__(cls) #相当于object.__new__(cls)
        return cls._inst

#单例2
class Singleton2(object):
    def __new__(cls,*args, **kwargs):
        if not hasattr(cls,'_inst'):
            cls._inst = object.__new__(cls)
        return cls._inst

if __name__ == '__main__':
    print(Singleton1())
    print(Singleton1())
    print(Singleton2())
    print(Singleton2())
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __new__(cls, name, age):
        if 0 < age < 150:  
            return super(Person, cls).__new__(cls) #return object.__new__(cls)
        else:
            return None

    def __str__(self):
        return '{0}({1})'.format(self.__class__.__name__, self.__dict__)

print(Person('Tom', 10))
print(Person('Mike', 200))

@staticmethod、@classmethod修饰符

我们知道对于一个普通的类,我们要使用其中的函数的话,需要对类进行实例化,而一个类中,某个函数前面加上了staticmethod或者classmethod的话,那么这个函数就可以不通过实例化直接调用

  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
    如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
    而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Animal(object):
    name = 'dog'
    def __init__(self,name):
        self.name = name

    def intro1(self):
        print('there is a %s'%(self.name))

    @staticmethod
    def intro2():
        print('there is a %s')

    @classmethod
    def intro3(cls):
        print('there is a %s'%(cls.name))

Animal('cat').intro1()
Animal.intro2()
Animal.intro3()

@property修饰符

property使方法像属性一样调用,就像是一种特殊的属性

有参函数时,@name.setter

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Animal(object):
    def __init__(self,name):
        self.name = name
    @property
    def intro(self):
        print('there is a %s eating'%(self.name))

    @intro.setter
    def intro(self,value):
        print('there is %d %s eating'%(value,self.name))

a = Animal('cat')
a.intro
a.intro=2

@修饰符

从第一个函数修饰符开始,自下而上做参数传递

#无参修饰 ,无参数时不需要调用
def log1(func):
    func()
@log1
def test():
    print('test:')


#有参修饰
def log2(func):
    def inner(*args, **kwargs):
        func(*args, **kwargs)
    return inner
@log2
def test(num):
    print('testlog2:',num,test.__name__)
test(20) #相当于log(test(20))


from functools import wraps
#可以看见@wraps可以保证装饰器修饰的函数的name的值保持不变

#不参数的装饰器
def log3(func):
    @wraps(func)
    def inner(*args, **kwargs,):
        func(*args, **kwargs)
    return inner
@log3
def test(num):
    print('testlog3:',num,test.__name__)
test(30) #相当于log(test(30))

@pysnooper修饰符

日志打印工具,用显示函数间的入参和返回值的变化

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import pysnooper

@pysnooper.snoop()
#@pysnooper.snoop('log.log')
def lisy(a):
    b=[x - 10 if x in [11, 12, 13] else x for x in a]
    return b
print(lisy([1,2,3,11,12,13,'111',222]))

在这里插入图片描述

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。