Python是一门动态语言,本文主要从python中属性方法的添加,删除,property的使用等方面进行介绍。
Python是动态语言,是因为Python定义类后,可以动态的更改类的内部结构。
1.对象属性的添加,类属性的添加,对象方法的添加,类方法的添加,静态方法的添加等以及删除。
说明:添加对象方法建议使用第二种,因为第一种不符 合常规调用对象方法的习惯。
class Foo(object): pass obj = Foo() # 添加对象属性 obj.a = 10 # print(obj.a) # 添加类属性 Foo.b = 20 # print(Foo.b) # print(obj.b) # 添加对象方法 def obj_fun(self): print(self.a) # 第一方法,通过类名追加对象方法, 所有这个类的对象都能调用这个对象方法 Foo.o_fun = obj_fun # obj.o_fun() # 第二方法,通过对象名追加对象方法,只有这个对象能够使用 # obj.o2_fun = obj_fun # # obj.o2_fun(obj) import types # 使用MethodType函数将obj与obj_fun的参数self绑定 obj.obj_fun = types.MethodType(obj_fun, obj) # obj.obj_fun() # 添加类方法 @classmethod def class_fun(cls): print(cls.b) Foo.class_fun = class_fun # Foo.class_fun() # 添加静态方法 @staticmethod def static_fun(): print("static_fun called") Foo.static_fun = static_fun # Foo.static_fun() # 删除属性方法 # 对象属性 # del obj.a delattr(obj, "a") # print(obj.a) # 类属性 del Foo.b # print(Foo.b) # 对象方法 del Foo.obj_fun # obj.obj_fun() # 类方法 del Foo.class_fun # 静态方法 del Foo.static_fun
2.使用slots属性限制动态添加特性。说明:slots只会限制对象动态的添加,而不会限制类进行动态的添加,目前,限制类动态添加的方法暂时没有。
# 类通过定义一个__slots__属性来限制对象动态添加属性和方法 # 不能限制通过类的方式添加属性和方法 class Foo(object): __slots__ = ["name", "age"] # 定义限制对象添加的列表 f = Foo() f.name = "ling" print(f.name) # ling f.age = 21 print(f.age) # 21 # f.sex = "nv" # print(f.sex) # 报错 # f.sex = "nv" # AttributeError: 'Foo' object has no attribute 'sex' Foo.sex = "nv" # 类属性 print(f.sex) def c(self): print(self.name) # import types # # f.c = types.MethodType(c, f) # f.c() #报错 # f.c = types.MethodType(c, f) # AttributeError: 'Foo' object has no attribute 'c' Foo.c = c f.c() # ling # 21 # nv # ling
3.访问私有属性。说明:python非常灵活,给你提供私有的特性,又在极特殊情况下可以使用。即通过名字重整的情况。
class Foo(object): def __init__(self): self.__name = "xiaoming" # 名字重整,Python解释器默认把私有属性改为_类名 即 _Foo__a class SonFoo(Foo): def print_name(self): print(self._Foo__name) obj = Foo() # print(obj.__name) # print(obj._Foo__name) sf = SonFoo() sf.print_name() # 小明
4.通过方法调用来获得私有属性。说明:使用property装饰器的时候,它只装饰get方法,必须有。
# 通过set和get方法 class Bank(object): def __init__(self): self.__money = 1000 def get_money(self): return self.__money def set_money(self, money): if isinstance(money, int): self.__money = money else: raise Exception("数据类型有误") b = Bank() print(b.get_money()) b.set_money(666) print(b.get_money()) # 通过property函数 class Bank(object): def __init__(self): self.__money = 1000 def get_money(self): return self.__money def set_money(self, money): if isinstance(money, int): self.__money = money else: raise Exception("数据类型有误") money = property(get_money, set_money) b = Bank() print(b.money) b.money = 666 print(b.money) # 通过property装饰器 class Bank(object): def __init__(self): self.__money = 1000 @property def money(self): return self.__money @money.setter def money(self, money): if isinstance(money, int): self.__money = money else: raise Exception("数据类型有误") b = Bank() print(b.money) b.money = 666 print(b.money) # 只读 class Bank(object): def __init__(self): self.__money = 1000 @property def money(self): return self.__money b = Bank() print(b.money) b.money = 666 print(b.money) # 只写 必须有读属性 class Bank(object): def __init__(self): self.__money = 1000 @property def money(self): raise AttributeError("不支持属性读取") @money.setter def money(self, money): if isinstance(money, int): self.__money = money else: raise Exception("数据类型有误") b = Bank() print(b.money) b.money = 666 print(b.money)