通常对类的属性进行封装时,需要写getter与setter方法,
写完后把setter,getter方法的值,存放入一个共有属性中,property()
如 `
class Student(object):
def __init__(self):
self.__age = 0
def set_age(self, age):
if 0 <= age <= 140:
self.__age = age
else:
self.__age = 0
def get_age(self):
return self.__age
age = property(get_age, set_age) #添加这一行
student = Student()
student.age = -29 #29
print("property 设置的年龄值为:", student.age)`
这样获取值时不用写student.get_age()
上述代码还可以用到装饰器@property
使用@property可让setter与getter方法称为属性函数,且可以对属性赋值时做必要的检查,并保证代码的简洁,清晰
作用:1.将setter与getter方法转换为只读方法;2.重新实现一个属性的setter设置和getter读取方发,同时也可作为一个方法是否结束的判定
@property
def 方法名(self):
return …
@方法名.setter
def 方法名(self,value):
…
动态语言
给类添加属性:类名.新属性名=属性值
添加方法
用到types模块下的MethodType()方法 MethodType(m,n) 把方法m添加到对象n中
# coding:utf-8
import types
# 方法
def show(self):
print("-------普通方法---------")
class User(object):
def start(self):
print("User 中的内部普通方法...start()")
user = User()
user.start()
# 添加方法 添加到 user 对象中的方法名为 run
user.run = types.MethodType(show, user)
# 调用
user.run() --对象名
静态方法和类方法
用到@staticmethod和@classmethod
类名.方法名=静态方法名或类方法名
# coding:utf-8
@classmethod
def run(cls): #注意第一个参数是cls
print("类方法:run()")
class User(object):
def start(self):
print("------start()--------")
u2 = User()
u2.start()
# 添加方法
User.run = run #类名.方法名=类方法名
User.run()
# 对象
u2.run()
__slots__变量
要限制python类能添加的属性,限制外部只能动态的添加某些属性,此时就可以使用
__slots__变量,该变量是一个元祖类型
class Person(object):
__slots_=("name","sex")
person=Person()
person.sex="male"
person.name="xiaoming"
person.age=24 #会报错 上边slots变量限制只能使用name sex属性