方法是对象;函数是对象;Python一切皆是对象
私有属性和私有方法(实现封装)
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age
def printPerson(self):
print('{0}的年龄是{1}'.format(self.name,self.__age))
def __printPerson(self):
print('{0}的年龄是{1}'.format(self.name, self.__age))
p = Person('sxl',21)
p.printPerson()
print(p.name)
print(p._Person__age)
p._Person__printPerson()
print(dir(p))
name存储:'name'
__age存储:'_Person__age'
__printPerson()存储:'_Person__printPerson'
@property 装饰器
将方法调用变成属性调用
class Person:
def __init__(self,name,age):
self.__name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
if 0<age<150:
self.__age = age
else:
print('年龄输入错误')
p = Person('sxl','18')
p.age = 3
print(p.age)
面向对象三大特征
封装(隐藏)
“私有属性、私有方法”的方式,实现“封装”。 实际上就是隐藏对象的属性和相关细节,只是一些调用。
继承
子类继承父类的方法 重复的方法,直接继承父类,而不用去重新拷贝代码
只有构造函数需要显示声明
class Student(Person):
def __init__(self,name,age,school):
Person.__init__(self,name,age)
self.school = school
覆盖父类的某个方法,直接调用该类的方法
print(Student.mro())
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
用于返回一个对于“对象的描述”
Python 支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索。
在子类中,如果想要获得父类的方法时,我们可以通过 super()来做。 super()代表父类的定义,不是父类对象。
多态
指同一个方法调用由于对象不同可能会产生不同的行为。
class Person:
def eye(self):
print('人类眼睛有颜色')
class Chinese(Person):
def eye(self):
print('棕色')
class Us(Person):
def eye(self):
print('蓝色')
def color(a):
if isinstance(a,Person):
a.eye()
color(Us())
color(Chinese())
|