类的方法重写、property、运算符重载
在外部定义类中的方法和属性
调用外部的属性,不需要特殊的操作,非常容易。调用外部方法,却需要特殊的方法MethodType,应用相关语法才能进行相关操作。同时可以通过__slots__方法对外部方法和属性的调用进行相关限制。
from types import MethodType #调用相应方法,让程序能够实现相应的外部方法调用
class Cat(object): #类的实现
__slots__ = ("name","age","speak","run")#__slots__中有的方法和属性名,外部才能进行定义,否则会报错
def Eat(self):
print("吃")
cat = Cat() #对象的实例化
cat.name="qqq"
print(cat.name)
def run(self): #外部跑方法
print("Run")
cat.run = MethodType(run,cat) #进行外部方法的调用
cat.run()
cat.Eat()
实现对象属性私有化,用__加属性名进行定义,并且提供了property让之后的访问更加容易
class person():
def __init__(self,age):
self.__age=age
@property
def age(self):#相当于get方法
return self.__age
@age.setter
def age(self,age):#相当于set方法,但是更方便于下面的调用
if age < 0:
age = 0
self.__age =age
person1 = person(18)
person1.age=-100 #访问受限
print(person1.age)
运算符重载
对于对象的操作,也可以根据不同的运算符,进行不同的操作,这个时候主要是通过类中的方法来实现的,这些方法相对固定,可以进行记忆使用
class car(object):
def __init__(self,num,name):
self.num = num
self.name =name
def __str__(self):#字符串
return "这类汽车的数量是%s"%self.num
def __add__(self, other):#对象相加
return self.num +other.num
def __len__(self):#求长度
return len(self.name)
car1 = car(23,"qwe")
car2 = car(13,"212")
print(len(car1))
print(car1+car2)
print(car1)
__pow__和__cmp__再python中的使用
好像自己使用封装好的函数会更加合理,自己定义感觉意义不大,可以进行原理的学习吧。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def __str__(self):
return '(%s: %s)' % (self.name, self.score)
__repr__ = __str__
def __pow__(self, power, modulo=2):#进行平方函数的定义,不是完全理解
return power**modulo
def __cmp__(self, s): #进行成绩比较函数的定义,基本理解如何进行使用
if self.score < s.score:
return s.name
elif self.score > s.score:
return self.name
else:
return 0
s1 = Student("s1号学生",11)
s2 = Student("s2号学生",112)
s3 = Student("s3号学生",116)
print("s1号学生平均的平方值:")
print(Student.__pow__(s1,s1.score))#进行成绩平方的输出
print("s2号学生平均的平方值:")
print(Student.__pow__(s2,s2.score))#进行成绩平方的输出
print("s3号学生平均的平方值:")
print(Student.__pow__(s3,s3.score))#进行成绩平方的输出
print("两个学生成绩进行比较,谁成绩高输出谁的名字,s1和s2进行比较")
print(Student.__cmp__(s1,s2))#进行成绩的比较,谁的成绩高输出谁的分数
print("两个学生成绩进行比较,谁成绩高输出谁的名字,s2和s3进行比较")
print(Student.__cmp__(s2,s3))#进行成绩的比较,谁的成绩高输出谁的分数