huakai 2020-03-07
面向对象有三大特征:封装、继承、多态
1、封装
封装:顾名思义就是将事物的属性隐藏起来,保证其不能被随意的修改
怎么封装:封装其实就是把属性定义为私有属性,定义私有属性和访问私有的属性都有特定的方法。一般使用set来设置私有属性,使用get来获得私有属性,在设置私有属性时需要给属性前加__。
class Object:
def __init__(self,name,age,sex):
self.name=name
self.__age=age
self.__sex=sex
def setage(self,maxage):
self.__age=maxage
def setsex(self,s):
self.__sex=s
def getage(self):
if self.__age>0 and self.__age<=150:
return self.__age
else:
return "数据不符合常理"
def getsex(self):
if self.__sex ==‘male‘ or self.__sex==‘female‘:
return self.__sex
else:
return "false"
p=Object("Allen",20,‘male‘)
print(p.getage(),p.getsex())#在尝试一下:p.age=15p.sex=‘female‘print(p.getage(),p.getsex())通过以上代码可以看出,函数被封装后,不能随意修改
2、继承
含义:类似于现代社会的继承,父业子承
class 子类名(父类名)
假设有一个类A,B是A的子类则:
class A(object)
class B(A)
class Door():
def __init__(self,height,width):
self.height=height
self.width= width
def openDoor(self):
print(‘the door is opening.‘)
def closeDoor(self):
print(‘the door is closed‘)
class SafeDoor(Door):
def newsafedoor(self):
print(‘width is ‘+ str(self.width))
mydoor=SafeDoor(20,30)
mydoor.newsafedoor()3、多态
含义:多态就是指一类事物有多种形态。
多态的作用:应用程序无需为每一个程序编写功能调用,只需要对父类进行处理即可,大大提高了程序的可复用性。
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
return ‘I am a Person, my name is %s‘ % self.name
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
return ‘I am a Student, my name is %s‘ % self.name
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def whoAmI(self):
return ‘I am a Teacher, my name is %s‘ % self.name
def who_am_i(x):
print( x.whoAmI())
p = Person(‘Allen‘, ‘Male‘)
s = Student(‘Tony‘, ‘Male‘, 22)
t = Teacher(‘Andy‘, ‘Female‘, ‘English‘)
who_am_i(p)
who_am_i(s)
who_am_i(t)方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
由于Python是动态语言,所以,传递给函数 who_am_i(x)的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可
class Singleton: def __new__: # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象 if not hasattr: cls.instance =