Python面向对象 | 类方法 classmethod
类方法:必须通过类的调用,而且此方法的意义:就是对类里面的变量或者方法进行修改添加。
例一个商店,店庆全场八折,代码怎么写呢?
class Goods: __discount = 0.8 # 折扣 def __init__(self,name,origin_price): self.name = name self.__price = origin_price @property def price(self): return self.__price * Goods.__discount apple = Goods('apple',5) banana = Goods('banana',8) print(apple.price) print(banana.price) ''' 执行输出: 4.0 6.4 '''
现在折扣变了,店庆结束,恢复原价。如何修改__discount变量呢?不能这么写。
Goods._Goods__discount = 1
怎么办呢?定义一个方法,修改属性
class Goods: __discount = 0.8 def __init__(self,name,origin_price): self.name = name self.__price = origin_price @property def price(self): return self.__price * Goods.__discount def change_discount(self,new_discount): # 修改折扣 Goods.__discount = new_discount #修改了全局的 apple = Goods('apple',5) banana = Goods('banana',8) apple.change_discount(1) #修改折扣为1 print(apple.price) print(banana.price) ''' 执行输出: 5 8 '''
但是修改类静态变量,不需要实例化才对啊。如果要改变折扣是全场的事情不牵扯到一个具体的物品 所以不应该使用对象来调用这个方法。
类函数(@classmethod):即类方法, 更关注从类中调用方法, 而不是在实例中调用方法
不依赖对象的方法 就应该定义成类方法,类方法可以任意操作类中的静态变量
class Goods: __discount = 0.8 # 折扣 def __init__(self,name,origin_price): self.name = name self.__price = origin_price # 原价 @property def price(self): # 价格 return self.__price * Goods.__discount @classmethod def change_discount(self,new_discount): Goods.__discount = new_discount Goods.change_discount(1) # 类方法 可以直接被类调用 不需要默认传对象参数 只需要传一个类参数就可以了 apple = Goods('apple',5) banana = Goods('banana',8) print(apple.price) print(banana.price) ''' 执行输出: 5 8 '''
练习题
假设我有一个学生类和一个班级类,想要实现的功能为:
- 执行班级人数增加的操作、获得班级的总人数;
- 学生类继承自班级类,每实例化一个学生,班级人数都能增加;
- 最后,我想定义一些学生,获得班级中的总人数。
class C: count = 0 def __init__(self): C.cou() @classmethod def cou(cls): cls.count += 1 obj = C() obj = C() obj = C() obj = C() obj = C() obj = C() obj = C() obj = C() obj = C() obj = C() obj = C()
思考:这个问题用类方法做比较合适,为什么?因为我实例化的是学生,但是如果我从学生这一个实例中获得班级总人数,在逻辑上显然是不合理的。同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。
class Student: __num = 0 def __init__(self, name, age): self.name = name self.age = age Student.addNum() # 写在__new__方法中比较合适,但是现在还没有学,暂且放到这里 @classmethod def addNum(cls): cls.__num += 1 @classmethod def getNum(cls): return cls.__num a = Student('Tony', 18) b = Student('John', 19) c = Student('Linda', 20)
Python面向对象 | 类方法 classmethod的更多相关文章
- python 面向对象 类方法,静态方法,property
property 内置装饰器函数 只在面向对象使用 把方法当初属性使用(方法不加参数) 例子: class Rectangle: def __init__(self,long,wide,color): ...
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法
一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在pytho ...
- Python面向对象之类属性类方法静态方法
类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...
- Python - 静态方法@staticmethod和类方法classmethod
传送门 https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day09/%E9%9D%A2%E5%90%91%E5%AF ...
- Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass
Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...
- python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass
https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...
- 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别
[面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...
- Python的3个方法:静态方法(staticmethod),类方法(classmethod)和实例方法
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
随机推荐
- Azure DevOps Server (TFS) 代码库Repo管理培训
Repo是分布式代码库Git中的一个专用词,用于存储和管理开发团队中特定的源代码. 使用Git,可以协调整个团队的代码更改. 即使您只是一个开发人员,版本控制也可以帮助您在修复错误和开发新功能时保持井 ...
- Hystrix(服务熔断,服务降级)
一.Hystrix 1.服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C有调用其他的微服务,这就是所谓的”扇出”,如扇出的链路上某个微服务的调用响应式过长或者 ...
- (五)golang--常用的一些玩意
\t--制表位 \n--换行符 \\--一个\ \"--一个” \r--回车 行注释://,一次性注释多行指令,选中代码后ctrl+/ 块注释:/* */ 代码规范: (1)官方推荐使用行注 ...
- [数据结构 - 第8章] 查找之哈希表(C语言实现)
首先是需要定义一个哈希表的结构以及一些相关的常数.其中 HashTable 就是哈希表结构.结构当中的 elem 为一个动态数组. #define HASHSIZE 12 // 定义哈希表长为数组的长 ...
- Loj #3045. 「ZJOI2019」开关
Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...
- TCP连接的建立(三次握手和四次挥手)
写到最后发现我描述的挺水的,这个老哥的用语比较专业一点https://blog.csdn.net/qq_38950316/article/details/81087809 (老哥这篇有些许错别字 大 ...
- RabbitMQ消息中间件的用法
1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消 ...
- 【JZOJ】2126. 最大约数和
题目大意 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 分析 把我们分解出来的因数进行合并,存在一个不知名的数组里,然后我们大可开始我们的迪屁!!(bag),我们可以 ...
- CentOS 7.0 使用yum 安装 Mariadb
第一步: 使用命令查看是否已经安装: mysql -u root -p 返回 Enter password: 时表示已经安装成功的,需要卸载安装. 第二步: 使用yum直接安装mariadb,注意带 ...
- eclipse安装sts