PYTHON面向对象(类)
一.PYTHON面向对象基础
面向对象侧重于对的人,做对的事
1.类和对象的基本概念
- 类的介绍
- 对象的介绍
- 类和对象的关系
2.类的设计基础
- 类设计的三要素
3.类使用的基本语法
3.1类的定义和使用基本语法
- 类的定义
- 类的使用
- 使用案例
class Cat:def eat(self):print("小猫爱吃鱼")def drink(self):print("小猫要喝水")# 创建猫对象
tom = Cat()tom.eat()
tom.drink()
3.2在类外部给已经实例的对象添加属性,并通过类内部方法来打印类内部信息。
class Cat:def eat(self):# 哪一个对象调用的方法,self就是哪一个对象的引用print("%s 爱吃鱼" % self.name)def drink(self):print("%s 要喝水" % self.name)# 创建猫对象
tom = Cat()
# 可以使用 .属性名 利用赋值语句就可以了
tom.name = "Tom"tom.eat()
tom.drink()print(tom)# 再创建一个猫对象
lazy_cat = Cat()
lazy_cat.name = "大懒猫"lazy_cat.eat()
lazy_cat.drink()print(lazy_cat)
3.3类初始化方法的介绍和使用
- 初始化方法的使用案例
class Cat:def __init__(self, new_name):print("这是一个初始化方法")# self.属性名 = 属性的初始值# self.name = "Tom"self.name = new_name #将重要变量动态化,不能固定死def eat(self):print("%s 爱吃鱼" % self.name)# 使用类名()创建对象的时候,会自动调用初始化方法 __init__
tom = Cat("Tom")print(tom.name)lazy_cat = Cat("大懒猫")
lazy_cat.eat()
3.4常用内置方法
- __ del __ 方法:希望在对象被销毁之前,再执行一些操作
class Cat:def __init__(self, new_name):self.name = new_nameprint("%s 来了" % self.name)def __del__(self):print("%s 我去了" % self.name)# tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)# del 关键字可以删除一个对象
del tomprint("-" * 50)
- __ str __方法:希望使用print打印输出对象时,输出自定义的文本内容
class Cat:def __init__(self, new_name):self.name = new_nameprint("%s 来了" % self.name)def __str__(self):# 必须返回一个字符串return "我是小猫[%s]" % self.name# tom 是一个全局变量
tom = Cat("Tom")
print(tom)
3.5私有属性与私有方法
类中的私有化设置参考-直通车
class Women:def __init__(self, name):self.name = nameself.__age = 18def __secret(self):# 在对象的方法内部,是可以访问对象的私有属性的print("%s 的年龄是 %d" % (self.name, self.__age))xiaofang = Women("小芳")# 私有属性,在外界不能够被直接访问
# print(xiaofang.__age)
# 私有方法,同样不允许在外界直接访问
# xiaofang.__secret()
3.6 新式类与旧式类(python3.0+ 都是新式类)
二,继承学习(实现代码的重用,降低冗余)
1.单继承(一个父类)
- 继承具有传递性:孙子会爸爸会的,也会爷爷会的。
- 使用案例
class Animal:def eat(self):print("吃---")def drink(self):print("喝---")def run(self):print("跑---")def sleep(self):print("睡---")#单继承
class Dog(Animal):def bark(self):print("汪汪叫")# 创建一个对象 - 狗对象
wangcai = Dog()wangcai.eat()
wangcai.drink()
wangcai.run()
wangcai.sleep()
wangcai.bark()
2.方法重写(当父类方法不能满足实际需求时,对父类方法进行修改重写)
- 当子类方法实现与父类方法实现完全不同时
class Animal:def eat(self):print("吃---")def drink(self):print("喝---")def run(self):print("跑---")def sleep(self):print("睡---")class Dog(Animal):def bark(self):print("汪汪叫")class XiaoTianQuan(Dog):def fly(self):print("我会飞")def bark(self):print("叫得跟神一样...")xtq = XiaoTianQuan()
# 如果子类中,重写了父类的方法
# 在使用子类对象调用方法时,会调用子类中重写的方法
xtq.bark()
- 当子类方法实现包含着父类的方法实现时(对父类方法进行拓展)
class Animal:def eat(self):print("吃---")def drink(self):print("喝---")def run(self):print("跑---")def sleep(self):print("睡---")class Dog(Animal):def bark(self):print("汪汪叫")class XiaoTianQuan(Dog):def fly(self):print("我会飞")def bark(self):# 1. 针对子类特有的需求,编写代码print("神一样的叫唤...")# 2. 使用 super(). 调用原本在父类中封装的方法super().bark()# 3. 增加其他子类的代码print("$%^*%^$%^#%$%")xtq = XiaoTianQuan()# 如果子类中,重写了父类的方法
# 在使用子类对象调用方法时,会调用子类中重写的方法
xtq.bark()
3.类继承中的私有属性和方法特性
class A:def __init__(self):self.num1 = 100self.__num2 = 200def __test(self):print("私有方法 %d %d" % (self.num1, self.__num2))def test(self):print("父类的公有方法 %d" % self.__num2)self.__test()class B(A):def demo(self):# 1. 在子类的对象方法中,不能访问父类的私有属性# print("访问父类的私有属性 %d" % self.__num2)# 2. 在子类的对象方法中,不能调用父类的私有方法# self.__test()# 3. 访问父类的公有属性print("子类方法 %d调用父类共有属性" % self.num1)# 4. 调用父类的公有方法self.test()# 创建一个子类对象
b = B()b.demo()# 在外界访问父类的公有属性/调用公有方法
# print(b.num1)
# b.test()# 在外界不能直接访问对象的私有属性/调用私有方法
# print(b.__num2)
# b.__test()
4.多继承(一个子类多个父类)
- 使用语法
class A:def test(self):print("test 方法")class B:def demo(self):print("demo 方法")class C(A, B):"""多继承可以让子类对象,同时具有多个父类的属性和方法"""pass# 创建子类对象
c = C()c.test()
c.demo()
- 如果多个父类中存在同名的属性和方法,根据继承顺序执行先继承的父类方法。
class A:def test(self):print("A --- test 方法")def demo(self):print("A --- demo 方法")class B:def test(self):print("B --- test 方法")def demo(self):print("B --- demo 方法")class C(B, A):#同名则执行B父类中的方法"""多继承可以让子类对象,同时具有多个父类的属性和方法"""pass# 创建子类对象
c = C()c.test()
c.demo()# 确定C类对象调用方法的顺序
#(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
print(C.__mro__)#输出执行顺序,如果有执行的方法了就不往后查找了。左-->右查找
三,多态学习(增加代码的灵活度,如:同名不同参)
- 传入不同的狗对象执行同一个方法,会产生不同的结果
class Dog(object):def __init__(self, name):self.name = namedef game(self):print("%s 蹦蹦跳跳的玩耍..." % self.name)class XiaoTianDog(Dog):def game(self):print("%s 飞到天上去玩耍..." % self.name)class Person(object):def __init__(self, name):self.name = namedef game_with_dog(self, dog):print("%s 和 %s 快乐的玩耍..." % (self.name, dog.name))# 让狗玩耍dog.game()# 1. 创建一个狗对象
# wangcai = Dog("旺财")
wangcai = XiaoTianDog("飞天旺财")# 2. 创建一个小明对象
xiaoming = Person("小明")# 3. 让小明调用和狗玩的方法
xiaoming.game_with_dog(wangcai)
四,类属性,类方法,静态方法
1.类属性(往往用于计数等宏观的作用)
- 访问类属性一定要用 类名.属性名 来使用不要用 对象名.属性名来使用,会出问题。!
class Tool(object):# 使用赋值语句定义类属性,记录所有工具对象的数量count = 0def __init__(self, name):self.name = name# 让类属性的值+1Tool.count += 1# 1. 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")# 2. 输出工具对象的总数
print(Tool.count)#用类名.属性名来使用!!!!
2.类方法(不用实例化后执行的方法,直接使用类名调用即可)
class Tool(object):# 使用赋值语句定义类属性,记录所有工具对象的数量count = 0@classmethoddef show_tool_count(cls):print("工具对象的数量 %d" % cls.count)def __init__(self, name):self.name = name# 让类属性的值+1Tool.count += 1# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")# 调用类方法
Tool.show_tool_count()
3.静态方法(仅仅作为封装在某类里的一个工具函数)
class Dog(object):@staticmethoddef run():# 不访问实例属性/类属性print("小狗要跑...")# 通过类名.调用静态方法 - 不需要创建对象
Dog.run()
4.实例方法,类方法,静态方法综合案例
class Game(object):# 历史最高分top_score = 0def __init__(self, player_name):self.player_name = player_name@staticmethoddef show_help():print("帮助信息:让僵尸进入大门")@classmethoddef show_top_score(cls):print("历史记录 %d" % cls.top_score)def start_game(self):print("%s 开始游戏啦..." % self.player_name)# 1. 查看游戏的帮助信息(静态方法--什么信息都不需要)
Game.show_help()# 2. 查看历史最高分(类方法--仅需访问类属性)
Game.show_top_score()# 3. 创建游戏对象
game = Game("小明")game.start_game()#(实例方法,实例化后才能执行的方法)
五,单例模式(唯一的实例,如:回收站、打印机)
1.__ new __方法(作用:为对象分配空间,可以在分配时做一些操作)
class MusicPlayer(object):#给对象分配空间时执行def __new__(cls, *args, **kwargs):# 1. 创建对象时,new方法会被自动调用print("创建对象,分配空间")# 2. 为对象分配空间instance = super().__new__(cls)# 3. 返回对象的引用return instance#实例化时执行def __init__(self):print("播放器初始化")# 创建播放器对象
player = MusicPlayer()print(player)
2.单例类的创建
- 多次调用的结果是同一个,返回结果只有一个实例
class MusicPlayer(object):# 记录第一个被创建对象的引用instance = Nonedef __new__(cls, *args, **kwargs):# 1. 判断类属性是否是空对象if cls.instance is None:# 2. 调用父类的方法,为第一个对象分配空间cls.instance = super().__new__(cls)# 3. 返回类属性保存的对象引用return cls.instance# 创建多个对象
player1 = MusicPlayer()
print(player1)player2 = MusicPlayer()
print(player2)#<__main__.MusicPlayer object at 0x000002D83FED3D08>
#<__main__.MusicPlayer object at 0x000002D83FED3D08>
3.拓展:单例模式下初始化方法只执行一次的单例类(比如多次进入一个餐厅,只需要登记一次)
class MusicPlayer(object):# 记录第一个被创建对象的引用instance = None# 记录是否执行过初始化动作init_flag = Falsedef __new__(cls, *args, **kwargs):# 1. 判断类属性是否是空对象if cls.instance is None:# 2. 调用父类的方法,为第一个对象分配空间cls.instance = super().__new__(cls)# 3. 返回类属性保存的对象引用return cls.instancedef __init__(self):# 1. 判断是否执行过初始化动作if MusicPlayer.init_flag:return# 2. 如果没有执行过,在执行初始化动作print("初始化播放器")# 3. 修改类属性的标记MusicPlayer.init_flag = True# 创建多个对象
player1 = MusicPlayer()
print(player1)player2 = MusicPlayer()
print(player2)
PYTHON面向对象(类)相关推荐
- python面向对象类属性_python面向对象之类属性和类方法案例分析
本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...
- Python面向对象---类的基本使用
1.面向对象 类(class):是一种用来描述具有相同属性和方法的对象的集合. 类变量:类变量在整个实例化的对象中是公用的.一般定义在类中且在函数体之外. 方法:类中的函数 数据成员:类变量或者实例变 ...
- python面向对象类的成员_Python面向对象中类的成员
Python面向对象中类的成员总共有三种,分别是字段.方法和属性 Python Version: 3.5+ 字段 普通字段1 2 3 4 5 6 7 8class A: def __init__(se ...
- python面向对象类创建人物类包含姓名、职业_Python面向对象思想与应用入门教程【类与对象】...
本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在 ...
- python面向对象 —— 类和对象(一)
文章目录 一.面向对象的概念 二.类和对象 (一)类 (二)对象 (三)从对象抽象出类 三.创建类 (一)类属性 类变量和实例变量 (二)类的方法 参数 :self 的理解 __init__(初始化方 ...
- python面向对象类创建人物类包含姓名、职业_python面向对象类
面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux ...
- python面向对象类_python:面向对象(类)
#!usr/bin/env python # -*- coding:utf-8 -*- __author__ = "Samson" ###类变量与实例变量 class Role: ...
- python面向对象类_python面向对象-类和对象
一. 类的定义 class类名(): 代码 #定义类 classWasher():defwash(self):print("洗衣服") 注意:类名要满足标识符命名规则,同时遵循大驼 ...
- Python面向对象(类的成员之属性)
day24 类的成员之属性 1 class Foo(): 2 def bar(self): 3 print("bar") 4 5 @property 6 def per(self) ...
- python 面向对象 类的内置方法
判断是不是类cls的对象 class A:passa = A() print(isinstance(a,A)) 判断类sub是不是super的子类 class A:passclass B(A):pas ...
最新文章
- java content()_理解content(一)
- Wannafly交流赛1 B 	硬币[数学思维/贪心]
- xml处理相关文章收藏
- 我机器人里面的匡威照片_威尔史密斯在《我,机器人》里面穿的是匡威的那款鞋啊...
- uuid生成_php如何生成 uuid(总结)
- 语言ppt课件猜拳_八年级语文上册第22课 孟子三章讲解及课件下载
- 08TensorFlow2.0基础--8.1TensorFlow2.0特性
- ImageNet夺冠后转战NLP!卡内基梅隆华人博士提出谷歌搜索引擎核心技术
- oracle 中的角色
- AWK学习笔记八:AWK内置函数
- oracle11g 卸载步骤
- KM算法实现带权匹配C#版本和C++两个版本实现O^3
- 女神节福利:友萌君送你~健身踏青装备
- php 获取提成的公式,拿提成的工资怎么算的有公式吗_工资提成计算公式
- Python写自动化之图标锁定到任务栏或删除图标
- 头像裁剪框html css,GitHub - saintic/layui-cropper-avatar: Layui头像裁剪组件
- 《笨方法学 Python 3》35.分支和函数
- 普希金-假如生活欺骗了你
- Go爬虫colly官方示例六【xkcd_store】- 抓取xkcd商店商品列表
- js 格式化 java时间格式化_JavaScript前台页面使用jsjava对后台传过来的日期进行格式化...