类中三个装饰器

目录

  • 类中的三个装饰器
  • 一、@classmethod
  • 二、@staticmethod装饰器装饰静态方法
  • 三[email protected] 把一个方法伪装成属性

类中的三个装饰器

装饰类中的方法

  • @classmethod --->装饰类方法,不用self属性,只用类的cls属性

  • @staticmethod --->装饰静态方法,既不用self属性,又不用类cls的属性

  • @property --->把一个方法伪装属性

一、@classmethod

在类中一个方法不用对象属性,但使用静态属性,那这个方法就是类方法,被classmethod装饰器装饰的方法,都有一个默认的参数cls,这个参数就是当前类!

class A:
    __count = 0
    def __init__(self,name):
        self.name = name
        self.__add_count()  #只要执行init方法实例化对象就会产生调用 __add_count(),从而对静态属性__count操作
    @classmethod
    def __add_count(cls):  #私有方法
        cls.__count += 1  #让这个方法只能在内部被使用
    @classmethod #被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类
    def show_count(cls):
        return cls.__count

print(A.show_count())   # 0 类调用show_count方法查看类的静态属性
Sheldon = A('Sheldon')  # 实例化一个对象
print(Sheldon.show_count()) # 1 对象调用show_count方法查看类的静态属性

可以看出调用类方法,可以用对象调用,也可以使用类调用
但是这个方法默认参数永远是当前类的命名空间,而不是对象的

二、@staticmethod装饰器装饰静态方法

如果一个类中的方法不使用对象属性也不使用静态属性 -- 静态方法,@staticmethod装饰的这个方法实际上这个方法就是一个普通函数.

普通方法 类方法 静态方法
默认参数 self cls
操作的变量 操作对象属性 操作类属性 既不操作对象属性,也不操作类属性
所属的命名空间
调用方法 对象 类/对象 类/对象
装饰器 @classmethod @staticmethod

三[email protected] 把一个方法伪装成属性

@name.setter 注意,setter 装饰的函数名叫什么,那么在这个函数中绝对不可以对这个函数名同名属性的修改

@name.deleter 调用方方法进行删除属性

示例1
from math import pi
class Circle:
    def __init__(self,r):
        self.r = r

    @property  # 把一个方法伪装成属性
    def area(self):   # 被property装饰器装饰的方法不能传递除self以外的参数
        return pi*self.r**2

    @property
    def perimeter(self):
        return self.r*pi*2

c1 = Circle(5)
print(c1.area)
c1.r = 10
print(c1.area)   调用的时候不用加()
class Person:
    def __init__(self,name):
        self.__name = name  # 不让外部随便修改
    @property
    def name(self):
        return self.__name

Sheldon = Person('Sheldon')
print(Sheldon.name) #这样写起到不容易被别人修改的作用

原文地址:https://www.cnblogs.com/SkyOceanchen/p/11444589.html

时间: 2024-08-29 16:28:08

类中三个装饰器的相关文章

设计模式(三)_装饰器模式

上篇学习了策略模式,现在回想下,什么是策略模式,好了.本篇主要介绍装饰器模式,just do it! 什么是装饰器模式 装饰器模式指的是动态的将责任附加到对象上.若要扩展功能,装饰器模式提供了比继承更弹性的替代方案. 如何使用装饰器模式 老王来到商场买衣服,需要买衣服,裤子,帽子...... public class Wang { public void show(){ System.out.println("我穿上衣服,累计花费100元"); System.out.println(&

Python中的@property装饰器

要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: 1 class Student(object): 2 def __init__(self,name,score): 3 self.name=name 4 self.score=score 创建实例,运行结果: 1 tim=Student('Tim',97) 2 tim.score=100 3 tim.score 4 100 5 mary=Student('Mary',90) 6 m

python 中多个装饰器的执行顺序

python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inner1') ret = f1(*args,**kwargs) return ret return inner1 def wrapper2(f2): print('in wrapper2') def inner2(*args,**kwargs): print('in inner2') ret = f2

面向对象-类中的三个装饰器

为了代码更加完善,引入几个装饰器.. 装饰类中的方法 @classmethod    --->装饰类方法,不用self属性,只用类的cls属性 @staticmethod    --->装饰静态方法,既不用self属性,又不用类cls的属性 @property           --->把一个方法伪装属性 下面具体说说他们的用法: [email protected]装饰类方法,那什么是类方法呢? 在类中一个方法不用对象属性,但使用静态属性,那这个方法就是类方法,被classmethod

python中闭包和装饰器

---恢复内容开始--- 使用像javascript和python这样支持面向对象范式的语言进行编程时,都会涉及到闭包的概念以及闭包的使用.我们今天就从这两个方面来讨论一下闭包: 首先是维基百科中关于闭包的概念:在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性. 根据这句话,其实我们自己就可以总结出在python语

python函数三 (装饰器)

一.函数名(学名:第一类对象) 函数名本质上就是函数的内存地址.通俗点就是特殊的普通变量 def func(): print(111) func() print(func) # 结果: # 111 # <function func at 0x00000150713F6048> 1.可以被引用(即可以赋值给其他变量) def func(): print('in func') f = func f() # 结果: # in func 2.可以被当作容器类型的元素 def func(): print

Python中的单例模式——装饰器实现剖析

Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性. 单例模式定义:具有该模式的类只能生成一个实例对象. 先将代码写上 #创建实现单例模式的装饰器 1 def singleton (cls, *args, **kwargs): 2 instances = {} 3 def get_instance (*args, **kwargs): 4 if cls not in instances: 5 instanc

Java IO中的设计模式--装饰器和适配器模式

参考:http://my.oschina.net/gao0516/blog/136103 装饰器模式:是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能 适配器模式:将一个类的接口转换成客户希望的另外一个接口 直接上代码分析: package com.think.cla; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class

NSString类中三个用于获取子字符串的方法:

NSString类中提供了这样三个方法用于获取子字符串: – substringFromIndex: – substringWithRange: – substringToIndex: 它们该怎么使用呢?见下面代码即可知道. NSString *str = @"12345"; -substringFromIndex: 以指定索引开始(包括指定索引的字符,索引从0开始),并包括之后的全部字符: // NSString *subString0 = [str substringFromInd