面向对象:多态和封装、property
多态指的是一类事物有多种形态:python天生支持多态
例如:
class Wechat: def pay(self,money): print('支付%s钱'%money) class Alipay: def pay(self,money): print('支付%s钱'%money) class Applepay: def pay(self,money): print('支付%s钱'%money) # python中直接调用传参给payment即可调用上方所有类的方法 def pay(payment,maoney): payment.pay(maoney)
多态:在java中,由于是强数据类型,调用这些类需要给他们创建一个父类,意思就是允许将子类类型的指针赋值给父类类型的指针
class Payment:#父类 pass class Wechat(Payment): def pay(self,money): print('支付%s钱'%money) class Alipay(Payment): def pay(self,money): print('支付%s钱'%money) class Applepay(Payment): def pay(self,money): print('支付%s钱'%money) def pay(Payment payment,int maoney):#这里的Payment是父类Payment,在java中只有这样才能使用到子类Wechat等 payment.pay(maoney)
封装:
广义:面向对象的封装是对代码的保护,面向对象的思想本身就是一种,只让自己的对象能调用自己类中的方法就是一种封装
狭义:是面向对象的三大特性之一,属性和方法都藏起来,不让你能在外部调用,让你看不见
使用方法:名字前面加双下划线
class Person: def __init__(self,name,money): self.name = name self.__money = money #被封装,可以在类里使用 def __drawing(self): #被封装,可以在类里使用 print('我画画很好,但是保密') def func(self): self.__drawing() #调用被封装的方法 print(self.__money) #调用被封装的属性 aike = Person('aike',1000) print(aike.name) print(aike.__dict__)#被封装的属性以类名加属性的名字存在字典当中 print(aike._Person__money)#用key可以查看被封装的值,但是不建议这样使用 aike.func()#调用正常方法 print(aike.money)#被封装起来,无法调用,会报错 aike.__drawing#被封装起来,无法调用,会报错
会用到封装的场景:
1.隐藏起一个属性 不想让类的外部调用
2.我想保护这个属性,不想让属性随意被改变
3.我想保护这个属性,不被子类继承
class Person: def __init__(self,name,money): self.__name = name self.__money = money def get_name(self): return self.__name def set_name(self,new_name): if type(new_name) is str and new_name.isdigit() == False: self.__name = new_name return self.__name class Func(Person): print(Person.__name) #报错,父类被封装的属性或者方法不能被子类继承 aike = Person('aike',1000) print(aike.get_name()) print(aike.set_name('艾克')) print(aike.get_name())
property、setter、deleter:不改变对象调用属性名的方式(obj.name),实现被封装属性的查看、修改、删除
#以上方例子为例 class Person: def __init__(self,name,money): self.__name = name self.__money = money @property #查看 def name(self): return self.__name @name.setter #修改 def name(self,new_name): self.__name = new_name return self.__name @name.deleter #删除 def name(self): del self.name aike = Person('aike',1000) print(aike.name) aike.name = '艾克' print(aike.name) # del aike.name