python高级学习第二课(寒假)2022-1-4

学习笔记一:动态添加属性

(1)添加对象属性:通过[对象名.属性名]给类对象person1动态添加了对象属性age,而Person的另一个类对象person2却不能调用这个属性。通过对象名添加的对象属性,只有这个对象能使用

__slots__对Person2类的动态添加没有限制,而Person2类对象per不能再动态添加对象属性和方法。

class Person(object):
    def __init__(self,name):
        self.name = name

person1 = person("张三")
person1.age = "18"    # 类对象person1动态添加对象属性age
print(person1.name)    # 张三
print(person1.age)     # 18

person2 = Person("李四")
print(person2.name)        # 李四
print(person2.age)         # 报错:'Person' object has no attribute 'age'

#思考:限制添加属性,#解决:定义类的时候,定义一个特殊的属性(__slots__),可以限制动态添加的属性
class Person2(object):
    __slots__=("name","age")
#则此时只能添加name和age
per=Person2()
per.height=170
print(per.height)#报错,无法添加
      

(2)添加实例方法:Person类有一个方法:eat()方法。通过[types.MethodType(方法名, 对象名)]给类对象person1动态添加了对象方法run(),同理,Person的另一个类对象person2不能调用这个方法,通过对象名添加的对象方法,只有这个对象能使用

mport types

class Person(object):
    def __init__(self, newName, newAge):
        self.name = newName
        self.age = newAge

    def eat(self):
        print("---正在吃---")

def run(self):
    print("---正在跑---")

person1 = Person("张三", 18)
person1.eat()  # ---正在吃---
person1.run = types.MethodType(run, person1)  # 类对象zhangsan动态添加对象方法run()
person1.run()  # ---正在跑---

person2 = Person("李四", 28)
person2.eat()  # ---正在吃---
person2.run()  # 'Person' object has no attribute 'run'

学习笔记二:property

使用限制访问,需要自己写set和get方法才能访问

class Person(object)
    def__init__(self,age):
        #限制访问
        self.__age=age


#使用限制访问,需要自己写set和get方法才能访问
#per.setAge(15)
#print(per.getAge())

#取值
@property
def age(self):
    return self.__age
#赋值
@age.setter
def age(self,age):
    if age<0:
        age=0
    self.__age=age

per.age=100#相当于调用setage
print(per.age)#相当于调用getage

学习笔记三:运算符重载

python类的运算符重载意味着在类方法中拦截内置的操作,当类的实例出现在内置操作中,python自动调用你重载的方法(运算符的重载都是在类中进行定义的):

class operator:
    def __init__(self,num):
        self.num=num    #定义属性数字num为成绩
    def __pow__(self,other):  #重载乘方运算符
        return operator(self.num**other.num)
    def __str__(self):       #将地址转化为字符
        return str(self.num)
    def __cmp__(self, other):#重载比较运算符
        if self.num>other.num:  #if语句判断
            print("成绩1平方后:",self.num,">","成绩2平方后:",other.num)
        elif self.num<other.num:
            print("成绩1平方后:",self.num,"<","成绩2平方后:",other.num)
        else:print("成绩1平方后:",self.num,"=","成绩2平方后:",other.num)

n=operator(2)  #创建对象,用于乘方的左边
n1=operator(98)#对象:成绩1
n2=operator(96)#对象:成绩2
sum1=n1**n     #成绩1做乘方运算
sum2=n2**n     #成绩2做乘方运算
print("成绩1平方后=",sum1)
print("成绩2平方后=",sum2)
sum1.__cmp__(sum2)#调用重载比较运算符比较两个成绩乘方后的大小

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值