python @property @staticmethod @classmethod

学习记录一下python的相关语法@property,静态方法以及类方法的使用,对高效使用python来说用处很大:

1.回忆一下C++中的私有变量和静态方法,其中私有变量外界不可以直接调用,只能通过公开的实例方法进行赋值和读取

class Student{
public:
    void set_name(string name)
    {
        this->name = name;
    }
    void get_name()
    {
        return this->name;
    }
    // 静态方法只属于类,与实例无关,只能调用静态变量
    static void get_info()
    {
    	return class_info;
    }

private:
    string name;
    // 静态变量
    static string class_info;
};
//  静态变量必须单独初始化
string Student::class_info = '8';

2.@property 由于python中无私有变量这一说,大部分都是用_+变量名表示为默认私有变量,我们先仿照C++写一个给私有变量赋值和读取的函数

class Student(object):
    def __init__(self, name):
        self._name = name
     # 赋值
    def set_name(self, name):
        if not isinstance(name, str):
            raise TypeError('must be str')
        self._name = name
     # 读取
    def get_name(self):
        return self._name

测试:

std = Student('a')
std.get_name()
'a'
std.set_name('b')
std.get_name()
'b'

由于上面的写法过于繁琐,@property就可以高效的完成以上操作

class Student(object):
    def __init__(self, name):
        self._name = name
    # name方法变为类属性
    @property
    def name(self):
        return self._name
    
    # name属性添加赋值
    @name.setter
    def name(self, name):
        if not isinstance(name, str):
            raise TypeError('must be str')
        self._name = name
    
    # name属性添加删除
    @name.deleter
    def name(self):
        print('done')  

测试:

std = Student('a')
# 将name方法变为属性
std.name
'a'
# 属性赋值
std.name = 'b'
'b'
# 属性del
del std.name
done

3.python中的一个类包含了实例方法,静态方法@staticmethod,类方法@classmethod,其中实例方法必须传入self,只能实例化对象后调用;静态方法在不传入self即实例变量的情况下使用,可以直接使用类名调用;类方法需要传入类参数,只可以调用类变量,可以直接使用类名调用

class Student(object):  
    # 类变量
    class_info = 'class 1'
    
    def __init__(self, name):
        self._name = name
    # 实例方法 self参数,调用实例变量
    @property
    def name(self):
        return self._name
    
    # 类方法 参数为类参数,调用类变量
    @classmethod
    def info(cls):
        print('info:', cls.class_info)
    
    # 静态方法 传入参数与self无关
    @staticmethod
    def get_score(score):
        print('score:', score)

测试:

# 类名直接调用类方法
Student.info
Student.info()
info: class 1
# 类名直接调用静态方法
Student.get_score
Student.get_score(100)
score: 100
# 实例方法 必须先实例化对象
s = Student('a')
s.name
'a'
s.info()
info: class 1
s.get_score(100)
score: 100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值