13.2 面向对象的三大特征
13.2.1 封装
面向对象的封装:将属性和方法封装到一个类多个类,需要使用的时候,调用这些属性和方法
class User(object):
def __init__(self, name, age, gender, tel):
self.__name = name
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name=" + self.__name
#如何让外部访问到私有的属性 getter setter
# 提供公开的get方法访问
def get_name(self):
return self.__name
# 提供公共的set方法修改
def set_name(self, username):
self.__name = username
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
if __name__ == '__main__':
u = User("张三", 18, "男", "110")
# print(u)
print(u.get_name())
# print(u.age)
u.name = "lisi"
print(u.name)
封装的第二种方法:property()
class User(object):
def __init__(self, name, age, gender, tel):
self.__name = name
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name=" + self.__name
#如何让外部访问到私有的属性 getter setter
# 提供公开的get方法访问
def get_name(self):
return self.__name
# 提供公共的set方法修改
def set_name(self, username):
self.__name = username
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
#获取值的时候调用property()的第一个参数
name = property(get_name, set_name)
age = property(get_age, set_age)
if __name__ == '__main__':
u = User("张三", 18, "男", "110")
print(u)
u.name = "lisi"
print(u)
# print(u.get_name())
# print(u.age)
# u.name = "lisi"
# print(u.name)
# u.set_name("lisi")
# print(u.get_name())
封装的第三种方式:装饰器 @property
class User(object):
def __init__(self, name, age, gender, tel):
self.__name = name
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name=" + self.__name
@property
def name(self):
return self.__name
@name.setter
def name(self, username):
self.__name = username
#如何让外部访问到私有的属性 getter setter
# 提供公开的get方法访问
# def get_name(self):
# return self.__name
# 提供公共的set方法修改
#def set_name(self, username):
# self.__name = username
def get_age(self):
return self.__age
def set_age(self, age):
self.__age = age
#获取值的时候调用property()的第一个参数
# name = property(get_name, set_name)
# age = property(get_age, set_age)
if __name__ == '__main__':
u = User("张三", 18, "男", "110")
print(u.name)
u.name = "lisi"
print(u)
# print(u.get_name())
# print(u.age)
# u.name = "lisi"
# print(u.name)
# u.set_name("lisi")
# print(u.get_name())
13.2.2 继承
class RichMan(object):
def __init__(self):
self.money = 100000000
self.company = "阿里巴巴"
def tell_moto(self):
print("我没有钱")
class Son(RichMan):
pass
if __name__ == '__main__':
s = Son()
print(s.money)
print(s.company)
print(s.tell_moto())
私有:子类继承父类的时候并不能继承所有的属性和方法
重写(覆盖):子类继承父类的时候,可以重写方法
注意:重写的时候方法名、参数以及参数的个数必须保持一致
class RichMan(object):
def __init__(self,money,company):#__init__初始化
self.money=money
self.__company=company
def tell(self):
return "大儿子没有钱"
def _speak(self):
return '大儿子讲英语贼溜'
def working(self):
return 'A员工做的好'
class eldest_Son(RichMan):
def working(self):
return 'B员工做的好'
class younger_Son(RichMan):
def working(self):
return 'C员工做的好'
if __name__ == '__main__':
s=eldest_Son(1000,'aaa')
print('小儿子有',s.money,'元')
print(s.tell())
print(s._speak())
print(s.working())
面试题:python里有没有重载,有没有重写
重载:(同名不同参)方法名相同,参数以及参数的个数不同
python里面是没有重载,但是可以实现重载-----通过装饰器
python里面可以多继承
思考问题:A继承B和C,B和C里面都有H(),那么A继承是哪个H()?
广度优先
super关键字 :指针,默认指向的父类
class RichMan(object):
def __init__(self):
self.money = 100000000
self.company = "阿里巴巴"
self.__house = "北京"
def tell_moto(self):
print("我没有钱")
def __speak(self):
print("讲英文贼溜")
def working(self):
print("A员工工作的认真")
class Son(RichMan,object):
def working(self):
print("B员工工作认真")
def test(self):
self.working()
super().working()
if __name__ == '__main__':
s = Son()
# print(s.money)
# print(s.company)
# print(s.tell_moto())
# print(s.working())
s.test()
13.2.3 多态
ArrayList a1 = new ArrayList();
List l1 = new ArrayList();
弱数据类型语言 ,因为不用声明数据类型