学习笔记一:动态添加属性
(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)#调用重载比较运算符比较两个成绩乘方后的大小