面向对象
一、面向对象
什么面向过程?什么是面向对象?
语言的发展史
二、类和对象
什么是类?-------类别 关键字class进行定义类
对象-------类的实例,是一个真实存在的事物
定义的类:
通过class关键字定义,类里面可以包含属性
类名的命名规范:遵循大驼峰法 user_name UserName
"""定义一个用户类User
class User: 旧时类
class User(object): 新式类
这两种定义方式都可以,都是继承了object对象,但是推荐适用新式类
"""
class User(object):
#需要重写object里面的__init__(self),初始化方法,用来初始化属性,在构建方法的时候就会触发这个方法
def __init__(self,name,age,gender):
print("构建对象的时候被触发了")
self.name = "张三"
self.age = 18
self.gender = "男"
def study(self):
print("我爱学习!!")
if __name__ == '__main__':
print("马上要触发")
u = User()
print("触发结束了")
print(u.name)
print(u.age)
u.age += 1
print(u.age)
u.study()
"""
定义一个用户类User
class User: 旧时类
class User(object): 新式类
这两种定义方式都可以,都是继承了object对象,但是推荐适用新式类
"""
class User(object):
#需要重写object里面的__init__(self),初始化方法,用来初始化属性,在构建方法的时候就会触发这个方法
#一般在构建的对象的时候,才确当属性值
def __init__(self,name,age,gender):
# print("构建对象的时候被触发了")
# self.name = "张三"
# self.age = 18
# self.gender = "男"
self.name = name
self.age = age
self.gender = gender
def study(self):
print("我爱学习!!")
print("我是"+self.name+"爱学习")
def __str__(self):
#tostring是一样的
return "[name = "+self.name+",age = "+self.age+",gender = "+self.gender+"]"
if __name__ == '__main__':
# print("马上要触发")
# u = User()
# print("触发结束了")
# print(u.name)
# print(u.age)
# u.age += 1
# print(u.age)
# u.study() u = User("zhangsan","18","男")
print(u)
u.study()
# print(u.name)
三、面向对象的三大特征
封装 继承 多态
1.封装
面向对象的封装特指的是将属性和方法封装到一个类或者多个类中,在需要使用的时候,通过对象。调用对用的方法或者属性
第一种方法:get和set方法
class User(object):
def __init__(self,username,age,gender,tel):
self.__username = username
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name = "+self.__username+""
#get方法
def get_username(self):
return self.__username
#set方法
def set_username(self,name):
self.__username = name
u1 = User("zhangsan",18,"男","13128292927")
print(u1)
# print(u1.__username)
print(u1.get_username())
u1.set_username("lisi")
print(u1)
# u1.age += 1
# print(u1.age)
第二种方法:property()
class User(object):
def __init__(self,username,age,gender,tel):
self.__username = username
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self): return "name = "+self.__username+""
#get方法
def get_username(self):
return self.__username
#set方法
def set_username(self,name):
self.__username = name
username = property(get_username,set_username)
u1 = User("zhangsan",18,"男","13128292927")
print(u1.username)
u1.username = "lisi"
print(u1)
# print(u1)
# # print(u1.__username)
# print(u1.get_username())
# u1.set_username("lisi")
# print(u1)
# u1.age += 1
# print(u1.age)
第三种方法:通过装饰器@property在get方法上进行装饰
class User(object):
def __init__(self,username,age,gender,tel):
self.__username = username
self.__age = age
self.__gender = gender
self.__tel = tel
def __str__(self):
return "name = "+self.__username+""
@property
def username(self):
return self.__username
@username.setter
def username(self,name):
self.__username = name
# username = property(get_username,set_username)
u1 = User("zhangsan",18,"男","13128292927")
print(u1.username)
u1.username = "lisi"
print(u1)
# print(u1)
# # print(u1.__username)
# print(u1.get_username())
# u1.set_username("lisi")
# print(u1)
# u1.age += 1
# print(u1.age)
2.继承
类与类之间也是存在一种继承的关系
class RichMan(object):
def __init__(self):
self.money = 10000000
self.company = "阿里巴巴"
def tell_motto(self):
print("我对钱不感兴趣")
class Son(RichMan):
""" 继承RichMan类 """
pass
if __name__ == '__main__':
s = Son()
print(s.money)
print(s.company)
子类可以继承父类的属性和方法,能继承所有的方法和属性吗?----不能
注意:继承父类并不是所有的方法和属性都能继承,只能继承公开的属性和方法,私有的属性和方
法是不能被继承的
class RichMan(object):
def __init__(self):
self.__money = 10000000
self.company = "阿里巴巴"
def tell_motto(self):
print("我对钱不感兴趣")
def __speak_english(self):
print("将英文很厉害,口语很不错")
class Son(RichMan):
""" 继承RichMan类 """
pass
if __name__ == '__main__':
s = Son()
print(s.money)
print(s.company)
s.tell_motto()
方法的重写,继承可以实现方法的重写
方法重写(覆盖 Override):在继承的基础之上,如果子类的方法父类不能满足自己使用的时候,那
么可以重写这个方法
注意:重写方法的时候,方法的名称、参数一定要和父类必须一致
class RichMan(object):
def __init__(self):
self.__money = 10000000
self.company = "阿里巴巴"
def tell_motto(self):
print("我对钱不感兴趣")
def __speak_english(self):
print("将英文很厉害,口语很不错")
def working(self):
print("A员工表现的比较好")
class Son(RichMan):
""" 继承RichMan类 """
def working(self):
print("B员工表现的比较好")
if __name__ == '__main__':
s = Son()
# print(s.money)
print(s.company)
s.tell_motto()
s.working()
面试题:python 中有没有方法的重载?有没有方法的重写?
方法的重载(Overload): 函数名称相同,但是函数的参数个数或者类型不同
结论:python中有方法的重写,但是没有方法的重载,但是可以实现方法的重载(装饰器)
继承的本质:实现代码的复用
Python是支持多继承,class Son(RichMan,object,XXX,XXXX)
那么如果A类是继承B类和C类,B和C同时有一个H(),请问A继承的是哪个H()?
按照继承的顺序来找(广度优先)
super关键字:是一个指针,默认指向的父类
class RichMan(object):
def __init__(self):
self.__money = 10000000
self.company = "阿里巴巴"
def tell_motto(self):
print("我对钱不感兴趣")
def __speak_english(self):
print("将英文很厉害,口语很不错")
def working(self):
print("A员工表现的比较好")
class Son(RichMan,object):
""" 继承RichMan类 """
def working(self):
print("B员工表现的比较好")
def test(self):
self.working()
#super默认指向的是父类,如果有参数需要加上参数
super().working()
if __name__ == '__main__':
s = Son()
# print(s.money)
# print(s.company)
# s.tell_motto()
# s.working()
s.test()
3.多态
多态(python中不重要):指的是对象的多种状态,多态是基于继承的基础之上,父类引用指向子类实例的现象叫做多态
ArrayList a1 = new ArrayList()
List ls = new ArrayList()
注意:在弱数据类型语言中,因为不用声明数据类型,所以天生就支持多态