(八)面向对象----(三)
面向对象的三大特性----多态,封装
目录
8.3 property,classmethod,staticmethod
8.1多态
多态:同一事物的多种形态。水果:苹果,草莓,榴莲
多态性:向不同的对象调用相同的函数名,每个对象都用自己函数方法实现调用。水果的味道:苹果的味道,草莓的味道,榴莲的味道
from abc import abstractmethod,ABCMeta
class Fruit(metaclass=ABCMeta):
@abstractmethod
def taste(self):pass
class apple(Fruit):
def taste(self):
print('苹果味')
class banana(Fruit):
def taste(self):
print('香蕉味')
apple = apple()
banana = banana()
apple.taste()
banana.taste()
在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
python 动态强类型的语言
不崇尚根据继承所得来的相似
我只是自己实现我自己的代码就可以了。
如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
优点 : 松耦合 每个相似的类之间都没有影响
缺点 : 太随意了,只能靠自觉
8.2封装
python中所有的私有,都是在变量的左边加上双下划线的方法将其属性隐藏
所有的私有的 都不能在类的外部使用
a.对象的私有属性
b.类中的私有方法
c.类中的静态私有属性
class Dog:
__key = 123 # 私有静态属性
def __init__(self,name,kind):
self.name = name
self.__kind = kind # 私有属性
def __get_kind(self): # 私有方法
return self.__kind #只要在类的内部使用私有属性,就会自动的带上_类名
def login(self): # 正常的方法调用私有的方法
self.__get_kind()
yuki = Dog('yuki','bigdog')
print(yuki._Dog__kind) # _类名__属性名,外部可调用,但不提倡
print(yuki.get_kind()) #取不到
#有一个房子
class Room:
def __init__(self,name,length,width):
self.__name = name
self.__length = length
self.__width = width
def area(self):
return self.__length * self.__width
leo = Room('leo',10,10)
print(leo.area())
#100
修改房子名字
class Room:
def __init__(self,name,length,width):
self.__name = name
self.__length = length
self.__width = width
def get(self):
return set._name
def set(self, newname):
if type(newname) is str and newname.isdigit() == False:
self.__name = newname
else:
print('不合法的姓名')
def area(self):
return self.__length * self.__width
leo = Room('leo',10,10)
leo.name = 'aaaaa'
print(leo.name)
#aaaaa
会用到私有的这个概念的场景:
1.隐藏起一个属性 不想让类的外部调用
2.我想保护这个属性,不想让属性随意被改变
3.我想保护这个属性,不被子类继承
8.3 property,classmethod,staticmethod
相关链接:https://blog.csdn.net/zeroooorez/article/details/89577312