面向对象三大特性之多态以及封装

面向对象的三大特性之多态

什么是多态

Animal类表现出了Dog,Cat两种形态

1 class Animal:pass
2 class Dog(Animal):pass
3 class Cat(Animal):pass
多态示例
 1 class Payment:pass
 2 class Alipay(Payment):
 3     def pay(self):pass
 4 class Applepay(Payment):
 5     def pay(self):pass
 6 def pay(obj,money):
 7     obj.pay()
 8 app=Applepay()
 9 print(type(app))
10 pay(app,123)
11 alp=Alipay()
12 pay(alp,456)
View Code

java中运用多态来解决传参数时候  数据类型的规范问题 

str  就是一个类 

a = ‘123’

a = str('123')  str是一个类,str()就是实例化,a是一个对象,是str类的对象,a的type 就是str

什么是多态呢?

一个类表现出的多种形态:通过继承来实现的

在java中的表现:在一个函数中需要给参数指定数据类型,如果这个地方可以接受两个以上类型的参数,

        那么这些数据类型应该有一个父类,这个父类是所有子类对象的类型

1 def func(Cat mao):pass
2 def func(Dog gou):pass
3 def func(Animal gou|mao):pass
java示例

在python中:函数的参数不需要指定数据类型,所以我们也不需要通过继承的形式来统一一组类的类型,

      换句话说   所有的对象其实都是object类型,所以在python当中其实处处是多态。

def func(a):  a既可以传猫也可以传狗类型,随便传任意类型

鸭子类型:不是明确的通过继承实现的多态,而是通过一个模糊的概念来判断这个函数能不能接受这个类型的参数

def len(obj)

len()     str、list、tuple、dict、set、range()

print()  所有的对象都是鸭子类型

面向对象的三大特性之封装

广义上的封装

class 类名:

  def 方法1(self):pass

是为了只有这个类的对象才能使用定义在类中的方法

狭义上的封装

把一个名字藏在类中

1 class Goods:
2     __discount = 0       #私有的静态变量
3     print(__discount)       #在内部可以调用
4 print(Goods.__discount)     #在外部不可以调用
View Code

类中的静态变量和方法名在程序加载的过程中就已经执行完了,不需要等待调用

在这个类加载完成之前,Goods这个名字还没有出现在内存空间中

私有的静态属性可以在类的内部使用,用来隐藏某个变量的值

1 class Goods:
2     __discount = 0    #私有的静态变量
3        #变形:_类名__私有变量
4 print(Goods.__dict__)
5 print(Goods._Goods__discount)
View Code
 1 class Goods:                              
 2     __discount = 0.7    #私有的静态变量          
 3     def __init__(self,name,price):        
 4         self.name=name                    
 5         self.__price=price                
 6     def price(self):                      
 7         return self.__price*Goods.__discou
 8     def change_price(self,new_price):     
 9         if type(new_price) is int:        
10             self.__price = new_price      
11 apple=Goods('APPle',5)                    
12 print(apple.price())            #3.5      
13 apple.change_price(10)                    
14 print(apple.price())             #7.0     
买苹果隐藏原价和加价的例子
 1 class User:
 2     def __init__(self,username,password):
 3         self.user=username
 4         self.__pwd=password
 5         self.pwd=self.__getpwd()
 6     def __getpwd(self):
 7         return hash(self.__pwd)
 8 obj=User('wang','wang123')
 9 print(obj.user,obj.pwd) 
10 #wang   6040613234356822785
输入账户密码返回哈希值,查不到原本密码

类中的私有成员:

  私有的静态属性

  私有的对象属性

  私有的方法

为什么要定义私有变量?

  不想让别人看到这个值

  不想让别人修改这个值

  让别人在修改这个值的时候加一些限制

  有些方法或属性不希望被子类继承

私有变量不能在外部定义

私有变量不能被继承

 1 class A:
 2     __country = 'China'
 3     def __init__(self,name):
 4         self.__name=name    #'_A__name'
 5 class B(A):
 6     # print(__country)
 7     # NameError: name '_B__country' is not defined
 8     def get_name(self):
 9         return self.__name    #'_B__name'
10 b=B('alex')
11 print(b.__dict__)   #{'_A__name': 'alex'
私有变量不能被继承

广义上的封装:把属性函数放到类里

狭义上的封装:定义私有成员

 

posted @ 2018-08-29 16:21  .why  阅读(156)  评论(0)    收藏  举报
Live2D