一、给类绑定属性
类名.属性名 = 属性值
二、类/对象的属性操作
# 给类设置属性 setattr(obj,"name",20) # 是否有age属性 hasattr(Stu,"age") # 获取属性 getattr(Stu,"name") # 如果一个属性不存在 返回默认值 getattr(Stu,"age",404)
三、给对象和类绑定方法
# 对象绑定方法 from types import MethodType class Stu(): # 构造方法 def __init__(self): print("I am a stu") def set_age(self,age): self.age = age # 我想把set_age方法放入到Stu s = Stu() s.set_age = MethodType(set_age,s) s.set_age(18) print(s.age) 注意: 给一个实例绑定方法,对另外一个实例是不起作用的,只是针对当前实例 否则出现错误:AttributeError: 'Stu' object has no attribute 'set_age'
# 类绑定方法 from types import MethodType class Stu(): # 构造方法 def __init__(self): print("I am a stu") def set_age(self,age): self.age = age # 把set_age嵌入到类里 Stu.set_age = MethodType(set_age,Stu) 注意: 给class绑定方法后,所有实例均可调用,而且绑定属性是公共属性,所有对象都可以对其修改
四、__slots__限制class实例添加属性
__slots__限制class实例能添加的属性
添加的属性如果没有在slot限定范围内,会出现(AttributeError: ‘Stu’ object has no attribute ‘weight’)的错误(不能自己新添除了slot里面的属性)
class Stu(): __slots__ = ("name","age","height") # 用元组定义允许绑定属性名称 注意: 使用__slots__要注意,__slots__定义属性仅对当前类起作用,对继承的子类不起作用(子类可以设置多余属性),多个属性名可以用元组,集合,列表形式表达
五、私有属性和私有方法
5.1 类的私有属性
__privateattrs : 两个下划线开头,声明该属性私有,不能在类外部被使用或者访问。如果是在类内部调用,我们使用self.__privateattrs
如何访问:
obj._类名__name
私有属性: 对象直接访问:AttributeError: 'Test' object has no attribute '__age'
class Test(): __age = 18 def public_fun(self): return self.__age test = Test() # 在外部插入私有属性,并不会真正把其当做私有的 test.__name = 15 print(test.__name)
# 类内部获取和更改类外部__age属性 class Test(): # __age = 18 def public_fun(self): return self.__age def update(self): self.__dict__["__age"] = 200 # 更改__age的属性值 t = Test() t.__age = 18 t.update() print(t.__age)
5.2 类的方法
__privatemethods: 两个下划线开头,只有类内部调用(self.__privatemethods),不能外部调用
class Test: def __fun(self): print("我是私有方法__fun") # 调用私有方法 def public_speak(self): self.__fun() t = Test() # 通过公共方法调用 t.public_speak() # 通过解析器方法调用 t._Test__fun() # 通过类+实体 Test._Test__fun(Test())
class F: money = "我缺钱" def __d(self): print("私有方法") def a(self): print("公共方法") class Son(F): def f(self): self._F__d() s = Son() print(s.money) s.a() s.f()
六、@property 装饰器
class Stu(object): __name = "male" __age = 0 @property def age(self): return self.__age @age.setter def age(self,v): if not isinstance(v,int): raise ValueError("值错误") if v > 130 or v < 0: raise ValueError("值错误") self.__age = v m = Stu() m.age = 100 print(m.age)
import time class TestAge(): __birth = "出生年份" @property def birth(self): return self.__birth @birth.setter def birth(self,birth): self.__birth = birth # 获取年龄 @property def age(self): return int(time.strftime("%Y")) - self.__birth t = TestAge() t.birth = 2000 # set birth print(t.age) # get age