类中的三个装饰器方法
阅读目录:
classmethod
类方法@classmethod:一个方法不用对象属性但是使用静态属性
- 调用这个类方法,可以使用对象调用,也可以使用类调用
- 这个方法的默认参数永远是当前类的命名空间,而不是对象的
- 操作静态属性
class A: __count = 0 # 隐藏了count属性 def __init__(self,name): self.name = name self.__add_count() # 每一次实例化的时候调 # 用私有方法来对__count进行累加 @classmethod def __add_count(cls): # 定义一个私有的方法 cls.__count += 1 # 让这个方法只能在类的内部被使用 @classmethod # 被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类 def show_count(cls): # 定义一个普通方法, return cls.__count # 让用户可以从外部查看__count的值 def eat(self): print('%s在吃饭'%self.name) print(A.show_count()) alex = A('张三') print(alex.show_count()) yuan = A('李四') print(A.show_count())
class Student: 文件的路径 = 'student.info' def __init__(self): # self :属于这个学生自己的一块空间 self.courses = [] @classmethod def show_courses(cls): # 由于查看文件需要用到Student类中的一个静态属性 -- 类方法 print('打开课程文件%s,一个一个读出来'%cls.文件的路径) def select_courses(self): # 选课 是一个对象方法(普通的方法) self.courses.append('某一门课程') # 操作的课程一定是属于某一个对象 Student.show_courses() alex = Student()
staticmethod
静态方法@staticmethod——如果一个类中的方法不用对象属性也不用静态属性
- 实际上这个方法就是一个普通的函数
class User(object): @staticmethod def login(arg1,arg2): # 是User类中的名字 函数的名字 login就是一个类中的静态方法,本质上就是一个函数 print(arg1,arg2) return (arg1+arg2) class Student(User):pass class Manager(User):pass ret = User.login(1,2) print(ret)
property属性
1、某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性
# 例1 - 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)
2、某一个属性需要被私有化,又需要能被外部查看,这种情况,把这个属性通过方法返回,方法伪装成属性
class Person:
def __init__(self,name):
self.__name = name # 不让外面随便修改
@property
def name(self):
return self.__name
alex = Person('alex')
print(alex.name)
3、修改属性值
class Person:
def __init__(self,name):
self.__name = name # 不让外面随便修改
@property
def name(self):
return self.__name
@name.setter # 之前必须有一个同名的方法被property装饰过
def name(self,new_name):
if type(new_name) is str:
self.__name = new_name
@name.deleter
def name(self):
del self.__name
# def set_name(self,new_name):
# if type(new_name) is str:
# self.__name = new_name
alex = Person('alex')
print(alex.name)
# alex.set_name(123)
# print(alex.name)
alex.name = 'alex_sb'
print(alex.name)
del alex.name # 只是相当于调用被deleter装饰的方法,并不相当于删除name属性
print(alex.name)