1、动态添加属性,方法
- 动态添加属性
class People(object):
pass
peo=People()
peo.name="tom"
print(peo.name)
- 动态添加方法:与动态添加属性不同,动态添加时需要导入某些包,如下
from types import MethodType
示例:
#导入包
from types import MethodType
#定义类
class Cat(object):
def __init__(self,name):
self.name=name
print("小猫的名字是"+self.name)
#实例化对象
cat=Cat("小花")
#定义跑方法
def run(self):
print("跑起来了")
return ""
#将跑方法添加到Cat类中
cat.run=MethodType(run,cat)
#调用添加进去的跑方法
print(cat.run())
- 限制动态添加:定义类的时候,定义一个特殊的属性(__slots__),可以限制动态添加的属性
示例1:
class People(object):
__slots__ = ("name","age","id")
peo=People()
peo.name="tom"
print(peo.name)
示例2:
class People(object):
__slots__ = ("name","age","id")
peo=People()
peo.sex="男"
print(peo.sex)
2、Propeoty的使用
通常情况下在类中定义的属性是对外暴露的,可以直接调用,这样就会造成数据的不安全,
class People(object):
def __init__(self,name):
self.name=name
p=People()#数据对外暴露,不安全
print(p.name)
所以我们需要限制外部对数据的访问,需要我们自己设置set和get方法来限制访问。
class People(object):
def __init__(self,name):
self.__name=name
def setName(self,name):
self.__name=name
def getName(self):
return self.__name
p=People()
p.setName("tom")
print(p.getName())
但是呢,平常敲代码时不是很方便记忆,所以我们需要使用@property,@property叫做装饰器,简单地说就是一个类里面的方法一旦被@property装饰,就可以像调用属性一样地去调用这个方法,它能够简化调用者获取数据的流程,而且不用担心将属性暴露出来,有人对其进行赋值操作(避免使用者的不合理操作)。需要注意的两点是
- 调用被装饰方法的时候是不用加括号的
- 方法定义的时候有且只能有self一个参数
示例:
class People(object):
def __init__(self,age):
self.__age=age
#方法名为受限制的变量去掉下划线
@property
def age(self): #去掉下划线.setter
return self.__age
@age.setter #去掉下划线.setter
def age(self,age):
self.__age=age
p=People(10)
p.age=100
print(p.age)
结果:
3、运算符重载
类的专有方法:
- __init__ : 构造函数,在生成对象时调用
- __del__ : 析构函数,释放对象时使用
- __repr__ : 打印,转换
- __setitem__ : 按照索引赋值
- __getitem__: 按照索引获取值
- __len__: 获得长度
- __cmp__: 比较运算
- __call__: 函数调用
- __add__: 加运算
- __sub__: 减运算
- __mul__: 乘运算
- __truediv__: 除运算
- __mod__: 求余运算
- __pow__: 乘方
以加法为例:
class People(object):
def __init__(self,num):
self.num=num
def __add__(self, other):
return People(self.num+other.num)
def __str__(self):
return str(self.num)
p1=People(1)
p2=People(2)
print(p1+p2)
结果为: