Python面向对象基础
面向对象基本介绍
Python编程方式:
面向过程编程
面向函数编程
面向对象编程
名称定义:
如果函数没有在类中称之为
函数如果函数在类中称之为
方法
创建类
# 创建一个类,类名是Class_basisclass Class_basis:# 在类里面创建了一个方法ret,类里面的方法必须加一个self关键字def ret(self):# 当调用方法的时候输出retprint("ret")
使用类
# 通过Class_basis类创建一个对象obj(创建一个Class_basis实例),类名后面加括号obj = Class_basis()# 通过对象调用类中的ret方法obj.ret()
类的内存地址对应关系
面向对象之self
#!/usr/bin/env python# _*_ coding:utf-8 _*_# 创建一个类,类名是Class_basisclass Class_basis:# 在类里面创建了一个方法retdef ret(self,):# 输出self的内存地址print("方法ret的self内存地址", id(self))# 创建一个对象obj,类名后面加括号obj = Class_basis()# 输出对象obj的内存地址print("obj对象内存地址", id(obj))# 通过对象调用类中的ret方法obj.ret()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.pyobj对象内存地址 2420760156536方法ret的self内存地址 2420760156536Process finished with exit code 0
通过上面的测试可以很清楚的看到obj对象和类的方法中self内存地址是一样的,那么方法中的self就等于obj
如图
self是形式参数,有Python自行传递。
面向对象之封装
封装就是将内容封装到某个地方,以后再去调用被封装在某处的内容,在使用面向对象的封装特性时,需要:
将内容封装到某处
从某处调用被封装的内容
class Foo:def ret(self):# 输出backend变量的内容print(self.backend)obj = Foo()# 在对象中创建一个backend变量obj.backend = "as"obj.ret()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.pyasProcess finished with exit code 0
上面的封装是一种非主流的封装方式,下面的__init__构造方法封装方式是主流的封装方式
class Foo:# 进入类的时候首先执行__init__方法def __init__(self, name):"""__init__称之为构造方法:param name: Foo传递过来的参数"""# 在类中创建一个成员Name,它的值是传过来的形参nameself.Name = name# 类的方法def user(self):# 输出Name的值print(self.Name)# 创建对象,并且将"Ansheng"封装到对象中,类+括号的时候会自动执行__init__方法obj = Foo("Yangwen")# 执行user方法obj.user()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.pyAnshengProcess finished with exit code 0
del_ 解释器销毁对象时候自动调用,特殊的名:析构方法
封装的应用场景之一就是当同一类型的方法具有相同参数时,直接封装到对象即可。
实例
通过用户输入年龄和姓名输出用户的个人信息
#!/usr/bin/env python# _*_ coding:utf-8 _*_class Foo:def __init__(self, name, age):self.Name = nameself.Age = agedef info(self):print("""My name is: %sMy age is: %d""" % (self.Name, self.Age))ansheng = Foo("Yangwen", 18)ansheng.info()xiaoming = Foo("xiaoming", 30)xiaoming.info()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.pyMy name is: AnshengMy age is: 18My name is: xiaomingMy age is: 30Process finished with exit code 0
封装的应用场景之二就是把类当作模块,创建多个对象(对象内封装的数据可以不一样)
面向对象之继承基础
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
实例
创建一个人信息相关的类,比如说人拥有四肢、头发、眼、耳朵等信息,在创建一个中国人和外国人的类,中国人的语言是中文,皮肤是黄色,外国人的语言是英文,皮肤是黑色。
#!/usr/bin/env python# _*_ coding:utf-8 _*_class People:def __init__(self):print("""你的通用特征有:四肢、头发、眼、耳朵""")class China(People):def info(self):print("""你是中国人,你的语言是中文,皮肤是黄色""")class Us(People):def info(self):print("""你是美国人,你的语言是英文,皮肤是黑色""")c = China()c.info()m = Us()m.info()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py你的通用特征有:四肢、头发、眼、耳朵你是中国人,你的语言是中文,皮肤是黄色你的通用特征有:四肢、头发、眼、耳朵你是美国人,你的语言是英文,皮肤是黑色Process finished with exit code 0
People —> 父类 or 基类
China and Us —> 子类 or 派生类
派生类可以集成基类中所有的功能
派生类和积累同时存在,优先找派生类
Python类可以同时继承多个类
面向对象之继承之多继承(新式类)
多继承就是在class My(China, Us):括号内放入多个父类名。
多继承顺序
当My(China, Us)时,因为My类中有info这个方法,所以输出的结果是我就是我
#!/usr/bin/env python# _*_ coding:utf-8 _*_class China:def info(self):print("你是中国人")class Us:def info(self):print("你是美国人")class My(China, Us):def info(self):print("我就是我")c = My()c.info()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py我就是我Process finished with exit code 0
当My(China, Us)时,My类中没有info这个方法,输出的结果是你是中国人,默认括号内左边的类优先
#!/usr/bin/env python# _*_ coding:utf-8 _*_class China:def info(self):print("你是中国人")class Us:def info(self):print("你是美国人")class My(China, Us):passc = My()c.info()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py你是中国人Process finished with exit code 0
当My(China, Us)时,My类中没有info这个方法,China类中也没有info这个方法,输出的结果是你是美国人
#!/usr/bin/env python# _*_ coding:utf-8 _*_class China:passclass Us:def info(self):print("你是美国人")class My(China, Us):passc = My()c.info()
执行结果
C:\Python35\python.exe F:/Python_code/sublime/Week06/Day02/class_01.py你是美国人Process finished with exit code 0
面向对象之继承之多继承时的查找顺序
顶层两个类没有父类的情况
顶层两个类有父类的情况
本文出自 “一盏烛光” 博客,谢绝转载!

免费 AI IDE


更多建议: