类中的三个装饰器方法

阅读目录:

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)

 

posted @ 2019-02-07 02:16  小萍瓶盖儿  阅读(477)  评论(0编辑  收藏  举报