多态与封装
1.多态:
什么是多态: 一个类表现出的多种状态,通过类的继承来实现
在java中一个函数要给的参数传指定的数据类型,如果这个地方有两个以上类型的参数,那么他应该有一个共同的父类,这个父类是所有子类对象的类型.
在python中,所有的对象都有一个共同的父类,所有传参时不需要指定的数据类型,所以说python处处是多态.
class Payment:pass class Applepay(Payment): def pay(self):pass class Alipay(Payment): def pay(self):pass def pay(obj,moneyz): obj.pay() app = Applepay() print(type(app)) pay(app,123) alp = Alipay() pay(alp,456)
2:多态 -- 鸭子类型:
不是明确通过继承来实现多态,而是通过一个模糊的概念来判断这个函数能不能接受这个参数的类型.
def len(obj): len()接受数据类型:str list tuple dict set range() print() 所有的对象都是鸭子类型
3.封装
1.广义的封装:为了只有这个类中的对象才能使用类中定义的方法.
class 类名:
def fun():pass
2.狭义的封装:把一个名字藏在类中
class Goods: __discount = 0 #私有的静态变量 print(__discount) # print(Goods.__discoount) #在类的外部不能引用类的私有静态变量 print(Goods.__dict__) print(Goods._Goods__discount) # 编程规范的角度上出发 我们不能在类的外部使用私有的变量
class Student: def __init__(self,name,age): self.__name = name self.age = age @property def name(self): return self.__name obj = Student('黎明',12) print(obj.name) print(obj.age)
3:类中的私有成员:
私有的静态属性
私有的对象属性
私有的方法
4.我们为什么要定义私有变量:
不希望别人看到这个值
不希望别人修改这个值
想让修改这个值有所限制
有些方法或属性不希望子类继承
class Goods: __discount = 1.5 #私有的静态属性 def __init__(self,name,price): self.name = name self.__price = price @property def price(self): return self.__price * Goods.__discount @property def change_price(self,new_price): if type(new_price) is int: self.__price = new_price else: print('本次价格修改不成功') apple = Goods('APPLE',5) # print(apple.price) apple.change_price(10) print(apple.price)
class User: def __init__(self,username,password): self.usr = username self.__pwd = password self.pwd = self.getpwd() def __getpwd(self): return hash(self.__pwd) obj = User('alex','sdf124') print(obj.usr,obj.pwd)
5:私有变量能不能继承:
class A: __country = 'China' def __init__(self,name): self.__name = name #_A__name class B(A): print(__country) #NameError:name"_B__country" is not defined def get_name(self): return self.__name #'_B__name' b = B('alex') print(b.__dict__)
4:装饰器函数:property
装饰器函数怎么用?在类,方法,函数的上面一行@装饰器函数
class Student: def __init__(self,name,age): self.__name = name self.age = age @property #将方法伪装成一个属性 def person(self): return self.__name obj = Student('黎明',30) # print(obj.person()) print(obj.person)