Python中动态添加方法、运算符重载、以及@property的用法

动态添加方法:

  •         作用:若是一个类中缺少某种方法,而此程序需要使用但又与该类没有继承关系,此时若想要添加此方法到该类中,就用到了动态添加方法。
from types import MethodType#导入类用于动态添加方法


class struck:#定义猫类

    def load(self):#定义方法(类内部方法)
        print("拉货物")


def run(self):#定义方法(类外部方法)
    print("跑长途")


s = struck()#创建实例化对象
s.run = MethodType(run,s)#动态将跑的方法添加到类里边

"""同一个对象调用一个属于自身的方法,一个不属于自身的方法"""
cat.load()#调用load方法
cat.run()#调用run方法

如上述代码所示要先导入外部模块,使用MethodType()方法就可实现动态添加方法到类中去。

运算符重载:

        运算符有:

        

        在这里我主要介绍一下__add__方法,因为其此运算符很常用,其他的原理是一样的

        运算符重载也相当于类中的方法,不过不同于普通方法的是,当Python检测到有相关运算时会自动调用该方法,就相当于创建实例对象时Python会自动调用__init__方法一样。

        废话不多说看代码:

class Student:#定义学生类
    def __init__(self, grade):#初始化变量
        self.grade = grade#定义变量并赋值

    def __add__(self,other):#重载运算符,用于平方运算
        return Student(self.grade+other.grade)#将运算结果保存在对象中并返回


    def __str__(self):#重载运算符,用于返回字符串类型
        return str(self.grade)#返回字符串类型的结果


stu1 = Student(90)#创建实例stu1
stu2 = Student(100)#创建实例stu2
print(stu1 + stu2)#输出结果是190

仔细看最后一行,两个对象可以相加吗?这似乎和我们想象的不太一样,此处就是运用到了运算符重载,当Python检测到stu1+stu2时会自动调用类中__add__方法,输出结果是190

@property:

class Person:#定义类
    def __init__(self, age):#初始化方法
        self.__age = age#定义变量并赋值

    @property#property引入
    def age(self):#同名方法,此处相当于getAge
        return self.__age#返回数值

    @age.setter#age.setter引入
    def age(self, age):#同名方法,此处相当于setAge
        if age < 0:#名字不能为负数
            self.__age = 0
        else:
            self.__age = age

per = Person(18)#创建实例对象
per.age = 20#赋值,此时正是property在起作用,相当于setAge
print(per.age)#获取值,此时正是setter和property在起作用,相当于getAge

运行结果:

 

        我们观察到,人的属性用双下划线被限制了即__age,但是后边还是可以使用点运算符进行修改,这是为什么呢?而且类中的两个方法age()是同名的,在python中方法重名是前边的方法会被后边的方法覆盖,可是,最后调用方法使任然没有被覆盖,这又是为什么呢?

        这就是@property的灵活用法,当我们不想类中属性被他人修改,就可以加上下划线加以限制,但是我们自己使用时又很麻烦,而且又想使用点运算,则可按照上述代码在方法前生命property和setter,被声明为@property的方法相当于get方法,用于获取属性值,而@setter声明的方法相当于set方法,用于设定属性值,且可以使用点运算赋值。所以上述代码的per.age = 20并不是修改了属性值,而是调用了set方法设置了属性值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值