函数&装饰器

一、给类绑定属性

类名.属性名 = 属性值

二、类/对象的属性操作

# 给类设置属性
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
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页