面向对象—类的扩展性:装饰器方法

本文深入探讨了Python中@property、@classmethod和@staticmethod装饰器的使用方法。通过圆形类和商品类的实例,详细讲解了如何将方法转换为属性,以及类方法和静态方法的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#classmethod staticmethod property
#三个装饰器函数

#part1 Property 将方法为伪装成一个属性
#圆形类
from math import pi
class Circle:
def __init__(self,r):
self.r=r
def area(self):
return self.r**2*pi
def perimeter(self):
return self.r*2*pi
c=Circle(3)
#求面积,调用area()方法:
print(c.area())

#但是,一般情况下,方法代表的是一个动作或者技能
# 而面积,名次,应该是一个属性,而不是一个方法
#所以,如何将方法为伪装成一个属相呢 在函数前面@property

class Circle:
def __init__(self,r):
self.r=r
@property
def area(self):
return self.r**2*pi
@property
def perimeter(self):
return self.r*2*pi
c=Circle(3)
print(c.area)
print(c.perimeter)
c.r=4
print(c.area)
print(c.perimeter)

#Part2 property 跟__私有属性结合
class Goods:
def __init__(self,price,discount):
self.__price=price
self.discount=discount
@property #将方法修改成属性
def price(self):
print('求折后价')
return self.__price*self.discount
@price.setter #修改属性的参数
def price(self,new_price):
print('重新赋值')
self.__price=new_price
@price.deleter #删除属性参数
def price(self):
del self.__price
apple=Goods(7,0.8)
print(apple.price)
apple.price=10 #执行price.setter功能
print(apple.price)
del apple.price #触发删除属性的方法,price.deleter方法
print(apple.__dict__)


#Part3 classmethod 把方法变成类方法
#如果一个类中的方法并没有用到这个类的实例中的具体属性,
# 只是用了类中的静态变量,就用类方法
class Person:
Country='中国人'
@classmethod #把func变成了一个类方法
def func(cls): # cls是指向类的内存空间
print('当前角色为%s'%cls.Country)
### alex=Person()
Person.func() #不需要实例,直接调用该方法

#Part4 staticmethod
#如果一个方法既不会用对象的属性,也不会用到类中的属性,就应该被定义为静态方法
class Student:
@staticmethod #定义一个静态方法,不需要传参
def login():
name=input('name:')
pwd=input('pwd:')
if name=='alex'and pwd=='123':
print('实例化')
Student.login()

转载于:https://www.cnblogs.com/lixiaoxuan/articles/9068402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值