0
点赞
收藏
分享

微信扫一扫

Python深度培训笔记二

alonwang 2022-01-06 阅读 59

一、动态给实例添加属性和方法,并使用

#动态给实例添加属性和方法,并使用

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)
举报

相关推荐

0 条评论