一、动态给实例添加属性和方法,并使用
#动态给实例添加属性和方法,并使用
from types import MethodType
#创建一个空类
class Person:
pass
# __slote__ = "name,hight,age,say"
per=Person()
#动态添加属性,体现了董涛语言的特点(灵活)
per.name="tom"
print(per.name)
#动态的添加方法
def say(self):
print("my name is "+self.name)
per.speak=MethodType(say,per)
per.speak()
#如果想要限制实例的属性怎么办?
#比如只允许添加name等特定属性
#在定义类时,定义一个特殊的属性(__slots__)
#per.run()
二、@property
使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。
属性名与方法名一定要区分开,不然会进入死循环(self._age,def age())
实例化的对象使用属性时,不是调用属性(meizi._age),而是用的方法名(meizi.age)
@property其实就是实现了getter功能; @xxx.setter实现的是setter功能;还有一个 @xxx.deleter实现删除功能
定义方法的时候 @property必须在 @xxx.setter之前,且二者修饰的方法名相同(age())
如果只实现了 @property(而没有实现@xxx.setter),那么该属性为 只读属性
class Person:
def __init__(self,age):
self.__age=age
# self.age=age #属性对外暴露,不安全,且没有数据过滤
# #限制访问
# self.__age=age
#
# def getAge(self):
# return self.__age
# def setAge(self,age):
# if age<0:
# age=0
# self.__age=age
#方法名为受限制的变量去掉双下划綫
@property
def age(self):
return self.__age
@age.setter#去掉下划线。setter
def age(self,age):
if age<0:
age=0
self.__age=age
per=Person(18)
per.age=19#相当于调用setAge
print(per.age)#相当于调用getAge
# #使用限制访问,需要自己写getset方法
# per.setAge(18)
# print(per.getAge())
#
三、运算符重载
什么是运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
作用:
让自定义的实例像内建对象一样进行运算符操作
让程序简洁易读
对自定义对象将运算符赋予新的规则
算术运算符的重载:
方法名 运算符和表达式 说明
__add__(self,rhs) self + rhs 加法
__sub__(self,rhs) self - rhs 减法
__mul__(self,rhs) self * rhs 乘法
__truediv__(self,rhs) self / rhs 除法
__floordiv__(self,rhs) self //rhs 地板除
__mod__(self,rhs) self % rhs 取模(求余)
__pow__(self,rhs) self **rhs 幂运算
#运算符重载
class Person:
def __init__(self, num):
self.num = num
#运算符重载
def __add__(self, other):
return Person(self.num + other.num)
def __str__(self):
return"num="+str(self.num)
per1 = Person(5)
per2 = Person(15)
print(per1 + per2)