| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python 面向对象 -> 正文阅读 |
|
[Python知识库]Python 面向对象 |
文章目录面向对象基础面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
类及类的定义类是一系列事务的统称,同类事务必定具有相同的特征。
特征:变量(成员变量) 行为:方法(成员方法) 成员变量和成员方法统称为类的成员。 类名的命名规范:大驼峰命名规则 类的定义 格式一
类的定义 格式二
对象的创建创建格式
成员变量成员变量用于描述对象的固有状态。 定义格式一(常用)
调用格式
定义格式二(不常用)
注意:
区别
成员方法成员方法用于描述对象的固有行为。 定义格式一
调用: 注意:
定义格式二
调用:
|
称呼 | 使用量排序 |
---|---|
全局变量 | 5 |
局部变量 | 2 |
公有变量 | 1 |
独有变量 | 5 |
私有变量 | 3 |
类变量 | 4 |
其他称呼 | 含义 |
---|---|
成员变量 | 公有变量 |
对象变量(对象的XXX变量) | 对象的变量 |
对象属性(对象的XXX属性) | 对象的属性,同对象的变量 |
演示
class User:
country = "类变量"
__title = "类变量,私有变量"
def __init__(self):
self.name = "公有变量"
self.__age = "公有变量,私有变量"
info = "局部变量"
def test(self):
self.address = "公有变量" # 共有变量建议全部定义在 __init__ 构造方法中
email = "局部变量"
u = User()
u.gender = "独有变量"
city = "全局变量"
info = "全局变量"
def test():
info = "局部变量"
global city # 全局变量
city = "全局变量"
称呼 | 使用量排序 |
---|---|
方法(一般指实例方法) | 1 |
类方法 | 2 |
静态方法 | 4 |
函数 | 3 |
其他称呼 | 含义 |
---|---|
成员方法 | 实例方法 |
构造方法 | __init__ 方法 |
class User:
def __init__(self, name, age):
self.name = name
self.age = age
print("构造方法")
def instance_method(self, info):
message = "你好"
name = self.name
print("实例方法,成员方法")
@classmethod
def class_method(cls):
message = "你好"
print("类方法")
@staticmethod
def static_method():
message = "你好"
print("静态方法")
称呼 | 含义 |
---|---|
对象 | 同实例 |
实例 | instance ,同对象含义一样 |
class User:
pass
u = User() # u:对象,也称为实例
继承是一种类间关系,描述一个类从另一个类获取成员信息的类间关系。
继承必定发生在两个类之间,参与继承关系的双方称为父类和子类。
父类提供成员信息,子类获取成员信息。
定义格式:
class 子类(父类):
pass
继承父类的成员:
注意事项:
class Animal:
type = "动物"
def __init__(self):
self.name = None
self.__age = None
def show(self):
print("我的名字是%s" % self.name)
class Cat(Animal):
def climb(self):
"""子类可以添加父类没有的成员"""
print("我的名字是%s,会爬树" % self.name)
c = Cat()
c.name = "张三"
print(c.name) # 张三
c.show() # 我的名字是张三
print(Cat.type) # 动物 (不建议子类调用父类的类变量)
print(Animal.type) # 动物
c.climb() # 我的名字是张三,会爬树
# print(c.__age) # 父类私有成员不可被继承
object
类是所有类的父类class 类名(object):
pass
使用 类名.__mro__
可以查看继承关系链
class Animal:
pass
class Cat(Animal):
pass
class PersianCat(Cat):
pass
print(Animal.__mro__) # (<class '__main__.Animal'>, <class 'object'>)
print(Cat.__mro__) # (<class '__main__.Cat'>, <class '__main__.Animal'>, <class 'object'>)
print(PersianCat.__mro__)
# (<class '__main__.PersianCat'>, <class '__main__.Cat'>, <class '__main__.Animal'>, <class 'object'>)
在子类中可以定义与父类相同名称的方法,此时子类的方法对父类的方法构成了重写。
如果子类重写了父类的方法,使用子类对象调用被重写的方法时时,执行子类中重写后的方法。
class Animal:
def eat(self):
print("动物吃东西")
class Cat(Animal):
def eat(self):
print("猫吃鱼")
c = Cat()
c.eat() # 猫吃鱼
print(c) # <__main__.Cat object at 0x0000021EB67D91D0>
class Cat:
def eat(self):
print("猫吃鱼")
def __str__(self):
return "喵咪"
print(c) # 喵咪
在子类中调用父类中被重写的实例方法
# 调用格式一:
父类名.方法名(对象)
# 调用格式二:
super(本类名, 对象).方法名()
# 调用格式三(推荐):
super().方法名()
class Animal:
def __init__(self):
print("动物被创建")
def eat(self):
print("动物吃东西")
class Cat(Animal):
def __init__(self):
super().__init__()
print("猫被创建")
def eat(self):
print("猫吃鱼")
# 格式一
Animal.eat(self)
# 格式二
super(Cat, self).eat()
# 格式三
super().eat()
def __str__(self):
s = super().__str__()
print("super().__str__(): %s" % s)
return "喵咪"
c = Cat()
print("---------------------")
c.eat()
print("---------------------")
print(c)
动物被创建
猫被创建
---------------------
猫吃鱼
动物吃东西
动物吃东西
动物吃东西
---------------------
super().__str__(): <__main__.Cat object at 0x00000186A2E49860>
喵咪
定义格式
class 类名(父类名1, 父类名2, ......):
pass
演示
简单多继承
class Father:
def sing(self):
print("爸爸会唱歌")
class Mother:
def dance(self):
print("妈妈会跳舞")
class Children(Father, Mother):
pass
c = Children()
c.sing() # 爸爸会唱歌
c.dance() # 妈妈会跳舞
多继承重名方法(默认执行靠前的父类中的方法)
class Father:
def sing(self):
print("会唱歌")
def dance(self):
print("跳舞很丑")
class Mother:
def dance(self):
print("会跳舞")
def sing(self):
print("唱歌难听")
class Children(Father, Mother):
pass
c = Children()
c.sing() # 会唱歌
c.dance() # 跳舞很丑
多继承重名方法,指定父类中的方法
class Father:
def sing(self):
print("会唱歌")
def dance(self):
print("跳舞很丑")
class Mother:
def dance(self):
print("会跳舞")
def sing(self):
print("唱歌难听")
class Children(Father, Mother):
def sing(self):
print("孩子不会唱歌")
Father.sing(self)
Mother.sing(self)
Father.dance(self)
Mother.dance(self)
c = Children()
c.sing()
# 孩子不会唱歌
# 会唱歌
# 唱歌难听
# 跳舞很丑
# 会跳舞
一个对象具有多种形态,在不同的使用环境中以不同的形态展示其功能,称该对象具有多态特征。
多态发生在继承关系的基础之上。
class Teacher:
def teach(self):
print("教授知识")
class Driver:
def drive(self):
print("开车")
class Man(Teacher, Driver):
def teach(self):
print("教授Java知识")
def drive(self):
print("开跑跑卡丁车")
class Demo:
def play(self, driver):
driver.drive()
def study(self, teacher):
teacher.teach()
demo = Demo()
# 方案一:直接创建对象
d = Driver()
demo.play(d) # 开车
t = Teacher()
demo.study(t) # 教授知识
# 方案二:创建一个具有指定特征的对象
man = Man()
demo.play(man) # 开跑跑卡丁车
demo.study(man) # 教授Java知识
对象在语法层面满足调用关系,实际不具有对应的对象形态,称该对象此时具备鸭子类型。
鸭子类型是一种特殊的多态表现形式。
class Teacher:
def teach(self):
print("教授知识")
class Man(Teacher):
def teach(self):
print("教授Java知识")
class GamePlayer:
def teach(self):
print("教玩游戏")
class Demo:
def dothing(self, teacher):
teacher.teach()
demo = Demo()
t = Teacher()
demo.dothing(t) # 教授知识
m = Man()
demo.dothing(m) # 教授Java知识
# g:鸭子类型
g = GamePlayer()
demo.dothing(g) # 教玩游戏
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 12:17:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |