学习记录一下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