1、使得python类中被@property装饰的方法可以像类属性一样被访问
例如:
class Student:
@property
def method_with_property(self): --含@property
return 15
def method_without_property(self): --不含@property
return 16
if __name__ == '__main__':
student = Student()
print(student.method_with_property) --加了@property后,可以用访问属性的形式来调用方法,后面不需要加()>>属性只能被访问,不能被调用通过function()的方式会报错 not callable
print(student.method_without_property()) --没有加@property , 必须使用正常的调用方法的形式,即在后面加()>>不加的话不会报错,但是会输出函数存放的内存地址
2、Python 私有变量的定义:
在Python中,有以下几种方式来定义变量:
2.1、xx:公有变量
2.2、_xx: 单前置下划线,私有化属性或方法,类对象和子类可以直接访问
2.3、_xx: 双前置下划线,私有化属性或方法,无法在外部直接访问
2.4、_xx: 双前后下划线,系统定义名字
2.5、xx_: 单后置下划线,用于避免与Python关键字冲突
例如: 在test类中定义了num,_num 和 __num三个属性,并创建了test的类对象t,对这三个属性进行访问,__num不能被访问到
class test(object):
def __init__(self):
self.num = 10
self._num = 20
self.__num = 30
t = test()
print(t.num) >> 10
print(t._num) >> 20
print(t.__num) >> AttributeError: 'test' object has no attribute '__num'
3、对python类中的私有属性进行操作的方法<方法有三>
3.1、getter和setter方法
class test(object):
def __init__(self):
self.__num = 10 >> 定义一个类私有属性,无法通过类对象直接访问
def getNum(self): >> 定义一个类方法,用于返回类的私有属性,因为在类的内部,类方法是可以访问类的私有属性的
return self.__num
def setNum(self, value): >> 定义一个类方法,用户设置更新类的私有属性的值
self.__num = value
t = test()
print(t.getNum()) # 10
t.setNum(20)
print(t.getNum()) # 20
3.2、property方法
class test(object):
def __init__(self):
self.__num = 10
def getNum(self):
return self.__num
def setNum(self, value):
self.__num = value
num = property(getNum,setNum) >> property()方法返回一个property属性,如果t是test的实例,那么t.num会调用getter方法,t.num = value会调用setter方法,而del t.num会调用deleter方法
t = test()
print(t.num) # 10 >> 此处调用的是property()的getter方法
t.num = 20
print(t.num) # 20 >> 此处调用的是property()的setter方法
3.3、@property装饰器
class C:
def __init__(self):
self.__x = None >> 定义一个私有变量
@property
def x(self): >> 创建一个与私有变量一样的方法
return self.__x
@x.setter
def x(self, value): >> 通过x.setter设置类私有变量的值
self.__x = value
@x.getter >> 调用私有变量的值
def x(self):
return self.__x
@x.deleter >> 删除变量的值
def x(self):
del self.__x
二、Python 静态方法
1、在开发中,我们常常需要定义一些方法,这些方法跟类有关,但在实现时并不需要引用类或者实例,例如,设置环境变量,修改另一个类的变量等。这个时候,我们可以使用静态方法。
class Dog(object):
food = "gutou"
age = "1"
def __init__(self, name)
self.name = name
@staticmethod >> 定义一个静态方法,修饰print_info函数
def print_info():
print(Dog.food, Dog.age) >> print_info函数(方法)与类有关,但是它调用时并没有引用类或者类的实例,所以使用静态方法