【python】python的类命名空间和类的property 和@property装饰器
一、命名空间分类
Python 类体中的代码位于
- 类命名空间(独立的命名空间)中。换句话说,所有用 class 关键字修饰的代码块,都可以看做是位于独立的命名空间中。
- 全局命名空间,即整个 Python 程序默认都位于全局命名空间中。而类体则独立位于类命名空间中。
#全局空间定义变量 name = "C语言中文网" add = "http://c.biancheng.net" # 全局空间定义函数 def say (): print("我在学习Python--全局") class CLanguage: # 定义CLanguage空间的say函数 def say(): print("我在学习Python--CLanguage独立空间") # 定义CLanguage空间的catalog变量 name = "C语言中文网" add = "http://c.biancheng.net" #调用全局的变量和函数 print(name,add) say() #调用类独立空间的变量和函数 print(CLanguage.name,CLanguage.add) CLanguage.say()
二、对象属性的setter,getter方法
2.1、setter和getter方法
不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过“类对象.方法(参数)”的方式操作属性,例如:
class CLanguage: #构造函数 def __init__(self,name): self.name = name #设置 name 属性值的函数 def setname(self,name): self.name = name #访问nema属性值的函数 def getname(self): return self.name #删除name属性值的函数 def delname(self): self.name="xxx" clang = CLanguage("C语言中文网") #获取name属性值 print(clang.getname()) #设置name属性值 clang.setname("Python教程") print(clang.getname()) #删除name属性值 clang.delname() print(clang.getname())
2.2、不破坏封装,又能替代setter和getter方法的property
属性名=property(fget=None, fset=None, fdel=None, doc=None)
其中,fget 参数用于指定获取该属性值的类方法,fset 参数用于指定设置该属性值的方法,fdel 参数用于指定删除该属性值的方法,最后的 doc 是一个文档字符串,用于说明此函数的作用。
注意,在使用 property() 函数时,以上 4 个参数可以仅指定第 1 个、或者前 2 个、或者前 3 个,当前也可以全部指定。也就是说,property() 函数中参数的指定并不是完全随意的。
class CLanguage: #构造函数 def __init__(self,n): self.__name = n #设置 name 属性值的函数 def setname(self,n): self.__name = n #访问nema属性值的函数 def getname(self): return self.__name #删除name属性值的函数 def delname(self): self.__name="xxx" #为name 属性配置 property() 函数 name = property(getname, setname, delname, '指明出处') #调取说明文档的 2 种方式 #print(CLanguage.name.__doc__) help(CLanguage.name) clang = CLanguage("C语言中文网") #调用 getname() 方法 print(clang.name) #调用 setname() 方法 clang.name="Python教程" print(clang.name) #调用 delname() 方法 del clang.name print(clang.name)
name = property(getname) # name 属性可读,不可写,也不能删除 name = property(getname, setname,delname) #name属性可读、可写、也可删除,就是没有说明文档
2.3、@property装饰器
既要保护类的封装特性,又要让开发者可以使用“对象.属性”的方式操作操作类属性,除了使用 property() 函数,Python 还提供了 @property 装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。
@property 的getter的语法格式如下:
@property def 方法名(self) 代码块
例如,定义一个矩形类,并定义用 @property 修饰的方法操作类中的 area 私有属性,代码如下:
class Rect: def __init__(self,area): self.__area = area @property def area(self): return self.__area rect = Rect(30) #直接通过方法名来访问 area 方法 print("矩形的面积是:",rect.area)
@property 的setter的语法格式如下:
@方法名.setter def 方法名(self, value): 代码块
例如,为 Rect 类中的 area 方法添加 setter 方法,代码如下:
@area.setter def area(self, value): self.__area = value
- rect.area = 90
- print("修改后的面积:",rect.area)
@property 的deleter 装饰器格式如下:
@方法名.deleter def 方法名(self): 代码块
例如,在 Rect 类中,给 area() 方法添加 deleter 方法,实现代码如下:
@area.deleter def area(self): self.__area = 0
然后运行如下代码:
del rect.area print("删除后的area值为:",rect.area)