Python既是面向过程也是面向对象的
C是完全面向过程的
JAVA是完全面向对象的

1、创建类,在init方法中添加属性,self和默认值,创建对象,访问属性,修改属性

class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10d1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)print(d1.name, d1.height, d1.blood, d1.power)d1.blood = 9
d1.power = 5
print(d1.name, d1.height, d1.blood, d1.power)输出:
大黄 0.7 10 3
大黄 0.7 9 5

2、添加方法,调用方法

class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{},身高{},血量{},攻击力{}".format(self.name, self.height, self.blood, self.power))def attack(self, dog2):dog2.blood = dog2.blood - self.powerd1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)d1.bark()
d2.bark()
d1.attack(d2)
d2.bark()输出:
我是大黄,身高0.7,血量10,攻击力3
我是二黑,身高0.5,血量10,攻击力4
我是二黑,身高0.5,血量7,攻击力4

3、通过方法改变属性的值

class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{},身高{},血量{},攻击力{}".format(self.name, self.height, self.blood, self.power))def attack(self, dog2):dog2.reduce_blood(self.power)def reduce_blood(self, reduce_value):if reduce_value > self.blood:self.blood = 0else:self.blood = self.blood - reduce_valued1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)d1.bark()
d2.bark()
d1.attack(d2)
d2.bark()

4、类属性,通过类修改类属性,通过对象修改类属性

类属性:

  • 整个类只有一份,所有的对象都共享这一份
  • 可以通过类或对象访问类属性,访问的都是同一个
  • 修改类属性需要通过类
  • 因为通过对象会给该对象自己创建一个同名属性
  • 对象属性和类属性同名时,使用对象访问优先使用对象属性
class Dog:num_of_dogs = 0  # 类属性def __init__(self, name, height, power):  # 实例属性self.name = nameself.height = heightself.power = powerself.blood = 10print("{}出生了,汪汪".format(self.name))def bark(self):print("我是{},身高{},血量{},攻击力{}".format(self.name, self.height, self.blood, self.power))def attack(self, dog2):dog2.reduce_blood(self.power)def reduce_blood(self, reduce_value):if reduce_value > self.blood:self.blood = 0else:self.blood = self.blood - reduce_valued1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)print(Dog.num_of_dogs)  # 通过类访问类属性
print(d2.num_of_dogs)   # 通过对象访问类属性
Dog.num_of_dogs = 8   # 通过类修改类属性
print(Dog.num_of_dogs)
print(d2.num_of_dogs)输出:
大黄出生了,汪汪
二黑出生了,汪汪
0
0
class Dog:num_of_dogs = 0  # 类属性def __init__(self, name, height, power):  # 实例属性self.name = nameself.height = heightself.power = powerself.blood = 10print("{}出生了,汪汪".format(self.name))def bark(self):print("我是{},身高{},血量{},攻击力{}".format(self.name, self.height, self.blood, self.power))def attack(self, dog2):dog2.reduce_blood(self.power)def reduce_blood(self, reduce_value):if reduce_value > self.blood:self.blood = 0else:self.blood = self.blood - reduce_valued1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)# print(Dog.num_of_dogs)  # 通过类访问类属性
# print(d2.num_of_dogs)   # 通过对象访问类属性
# Dog.num_of_dogs = 8   # 通过类修改类属性
# print(Dog.num_of_dogs)
# print(d2.num_of_dogs)d1.num_of_dogs = 8  # 通过对象修改类属性
print(Dog.num_of_dogs)
print(d1.num_of_dogs)  # 通过对象修改类属性,并不是修改类属性,而是给自己创建了一个同名属性
print(d2.num_of_dogs)输出:
大黄出生了,汪汪
二黑出生了,汪汪
0
8
0

5、类方法

类方法:

  • 类方法可以通过类名调用,也可以通过对象名调用
  • 类方法不能访问实例属性、实例方法,但类方法可以访问类属性
  • 类方法需要@classmethod, 第一个参数是cls,访问类属性cls.属性名
class Dog:# num_of_dogs = 0  # 类属性dogs = []@classmethoddef num_of_dogs(cls):   # 类方法return len(cls.dogs)  # 在类里面访问类属性:cls.属性名@classmethoddef biggest(cls):max_height = 0for d in cls.dogs:if d.height > max_height:  # 在属性方法里访问实例属性:对象名.实例属性名max_height = d.heightreturn max_heightdef __init__(self, name, height, power):  # 实例属性self.name = nameself.height = heightself.power = powerself.blood = 10# Dog.num_of_dogs += 1Dog.dogs.append(self)print("{}出生了,汪汪".format(self.name))def bark(self):print("我是{},身高{},血量{},攻击力{}".format(self.name, self.height, self.blood, self.power))def attack(self, dog2):dog2.reduce_blood(self.power)def reduce_blood(self, reduce_value):if reduce_value > self.blood:self.blood = 0else:self.blood = self.blood - reduce_valued1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)print(Dog.dogs)  # 通过类访问类属性
print(d2.dogs)   # 通过对象访问类属性
print(Dog.num_of_dogs())  # 通过类调用类方法
print(d1.num_of_dogs())   # 通过对象调用类方法
print(d2.biggest())输出:
大黄出生了,汪汪
二黑出生了,汪汪
[<__main__.Dog object at 0x00000204828D4508>, <__main__.Dog object at 0x00000204828D45C8>]
[<__main__.Dog object at 0x00000204828D4508>, <__main__.Dog object at 0x00000204828D45C8>]
2
2
0.7

6、静态方法

静态方法:

  • 静态方法@staticmethod
  • 不需要传入类或实例作为第一个参数
  • 静态方法调用方式与类方法一样
class Dog:# num_of_dogs = 0  # 类属性dogs = []@classmethoddef num_of_dogs(cls):   # 类方法return len(cls.dogs)  # 在类里面访问类属性:cls.属性名@classmethoddef biggest(cls):max_height = 0for d in cls.dogs:if d.height > max_height:  # 在属性方法里访问实例属性:对象名.实例属性名max_height = d.heightreturn max_height@staticmethoddef intro():  # 静态方法第一个参数,不需要cls或selfprint("dog is human's best friend")def __init__(self, name, height, power):  # 实例属性self.name = nameself.height = heightself.power = powerself.blood = 10# Dog.num_of_dogs += 1Dog.dogs.append(self)print("{}出生了,汪汪".format(self.name))def bark(self):print("我是{},身高{},血量{},攻击力{}".format(self.name, self.height, self.blood, self.power))def attack(self, dog2):dog2.reduce_blood(self.power)def reduce_blood(self, reduce_value):if reduce_value > self.blood:self.blood = 0else:self.blood = self.blood - reduce_valued1 = Dog("大黄", 0.7, 3)
d2 = Dog("二黑", 0.5, 4)Dog.intro()  # 通过类名调用静态方法
d2.intro()   # 通过对象名调用静态方法输出:
大黄出生了,汪汪
二黑出生了,汪汪
dog is human's best friend
dog is human's best friend

7、继承和super()


继承:

  • 父类有什么属性和方法,子类对象都可以调用
class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{},身高{}".format(self.name, self.height))class SheepDog(Dog):def __init__(self, name, height, power, num_of_sheeps):super().__init__(name, height, power)self.num_of_sheeps = num_of_sheepssd = SheepDog("牧羊犬1", 0.6, 4, 5)
print(sd.name, sd.blood, sd.num_of_sheeps)  # 子类对象访问父类属性、访问子类属性
sd.bark()  # 子类对象调用父类方法输出:
牧羊犬1 10 5
我是牧羊犬1,身高0.6

8、给子类添加方法

  • 子类默认继承父类的所有属性和方法
  • 同时,子类也可以有自己独特的属性和方法
class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{},身高{}".format(self.name, self.height))class SheepDog(Dog):def __init__(self, name, height, power, num_of_sheeps):super().__init__(name, height, power)self.num_of_sheeps = num_of_sheepsdef protect(self):print("我开始保护小羊啦!")class PoliceDog(Dog):def __init(self, name, height, power, ability):super().__init__(name, height, power)self.ability = abilityclass PetDog(Dog):def __init__(self, name, height, power, price):super().__init__(name, height, power)self.price = pricesd = SheepDog("牧羊犬1", 0.6, 4, 5)
print(sd.name, sd.blood, sd.num_of_sheeps)  # 子类对象访问父类属性、访问子类属性
sd.bark()  # 子类对象调用父类方法
sd.protect()输出:
牧羊犬1 10 5
我是牧羊犬1,身高0.6
我开始保护小羊啦!

9、重写父类方法

  • 子类有与父类的同名方法,则默认调用子类的同名方法
  • 如果要在子类调用父类同名方法,可以使用super()调用
class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{}Dog类的bark方法,身高{}".format(self.name, self.height))class SheepDog(Dog):def __init__(self, name, height, power, num_of_sheeps):super().__init__(name, height, power)self.num_of_sheeps = num_of_sheepsdef protect(self):print("我开始保护小羊啦!")def bark(self):print("我是牧羊犬子类的bark方法")class PoliceDog(Dog):def __init(self, name, height, power, ability):super().__init__(name, height, power)self.ability = abilityclass PetDog(Dog):def __init__(self, name, height, power, price):super().__init__(name, height, power)self.price = pricesd = SheepDog("牧羊犬1", 0.6, 4, 5)
print(sd.name, sd.blood, sd.num_of_sheeps)  # 子类对象访问父类属性、访问子类属性
sd.bark()  # 子类对象调用父类方法
sd.protect()输出:
牧羊犬1 10 5
我是牧羊犬子类的bark方法
我开始保护小羊啦!
class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{}Dog类的bark方法,身高{}".format(self.name, self.height))class SheepDog(Dog):def __init__(self, name, height, power, num_of_sheeps):super().__init__(name, height, power)self.num_of_sheeps = num_of_sheepsdef protect(self):print("我开始保护小羊啦!")def bark(self):print("我是牧羊犬子类的bark方法")super().bark()class PoliceDog(Dog):def __init(self, name, height, power, ability):super().__init__(name, height, power)self.ability = abilityclass PetDog(Dog):def __init__(self, name, height, power, price):super().__init__(name, height, power)self.price = pricesd = SheepDog("牧羊犬1", 0.6, 4, 5)
print(sd.name, sd.blood, sd.num_of_sheeps)  # 子类对象访问父类属性、访问子类属性
sd.bark()  # 子类对象调用父类方法
sd.protect()输出:
牧羊犬1 10 5
我是牧羊犬子类的bark方法
我是牧羊犬1Dog类的bark方法,身高0.6
我开始保护小羊啦!

10、命名规则

11、模块、类和引入

class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{}Dog类的bark方法,身高{}".format(self.name, self.height))class SheepDog(Dog):def __init__(self, name, height, power, num_of_sheeps):super().__init__(name, height, power)self.num_of_sheeps = num_of_sheepsdef protect(self):print("我开始保护小羊啦!")def bark(self):print("我是牧羊犬子类的bark方法")super().bark()class PoliceDog(Dog):def __init(self, name, height, power, ability):super().__init__(name, height, power)self.ability = abilityclass PetDog(Dog):def __init__(self, name, height, power, price):super().__init__(name, height, power)self.price = priceif __name__ == "__main__":sd = SheepDog("牧羊犬1", 0.6, 4, 5)print(sd.name, sd.blood, sd.num_of_sheeps)  # 子类对象访问父类属性、访问子类属性sd.bark()  # 子类对象调用父类方法sd.protect()

import dog
pd = dog.PetDog("京巴", 0.2, 1, 988)
print(pd.blood)
pd.bark()

12、继承标准库中的类

import turtle as tclass MyTurtle(t.Turtle):def draw_circle(self):self.color("red")self.circle(100)t = MyTurtle()
t.draw_circle()

13、把对象作为属性

class Dog:def __init__(self, name, height, power):self.name = nameself.height = heightself.power = powerself.blood = 10def bark(self):print("我是{}Dog类的bark方法,身高{}".format(self.name, self.height))class SheepDog(Dog):def __init__(self, name, height, power, num_of_sheeps):super().__init__(name, height, power)self.num_of_sheeps = num_of_sheepsdef protect(self):print("我开始保护小羊啦!")def bark(self):print("我是牧羊犬子类的bark方法")super().bark()class PoliceDog(Dog):def __init(self, name, height, power, ability):super().__init__(name, height, power)self.ability = abilityclass PetDog(Dog):def __init__(self, name, height, power, price, house):super().__init__(name, height, power)self.price = priceself.house = houseclass DogHouse():def __init__(self, no):self.no = noprint("已创建狗窝{}".format(self.no))if __name__ == "__main__":# sd = SheepDog("牧羊犬1", 0.6, 4, 5)# print(sd.name, sd.blood, sd.num_of_sheeps)  # 子类对象访问父类属性、访问子类属性# sd.bark()  # 子类对象调用父类方法# sd.protect()house = DogHouse("9527")pd = PetDog("京巴", 0.2, 1, 988, house)pd.bark()输出:
已创建狗窝9527
我是京巴Dog类的bark方法,身高0.2

14、dog版本的吃鸡游戏

import randomclass Dog:dogs = []  # 保存所有活着的dogdef __init__(self, name):self.name = nameself.attack_power = 5self.defense_power = 3self.blood = 100def attack(self, dog2):print("{}攻击{},攻击方的攻击力为:{},防御方的防御力为:{}".format(self.name, dog2.name, self.attack_power, dog2.defense_power))point = self.attack_power - dog2.defense_powerif dog2.blood > point:dog2.blood -= pointprint("{}受到攻击,奋力反击,血量减少为{}".format(dog2.name, dog2.blood))else:dog2.blood = 0print("{}受到攻击,失血过多,死亡".format(dog2.name))Dog.dogs.remove(dog2)       # 在类里面调用类属性,类名.属性名def dog_type(self):if isinstance(self, SheepDog):return "牧羊犬"elif isinstance(self, PoliceDog):return "警犬"else:return "普通犬"class SheepDog(Dog):def __init__(self, name):super().__init__(name)self.attack_power = random.randint(5, 10)self.defense_power = random.randint(3, 5)print("牧羊犬{}问世".format(self.name))  # 在子类里访问父类属性,self.父类属性名self.dogs.append(self)  # 在子类里修改父类属性,self.父类属性名=值class PoliceDog(Dog):def __init__(self, name):super().__init__(name)self.attack_power = random.randint(8, 13)self.defense_power = random.randint(1, 3)print("警犬{}问世".format(self.name))  # 在子类里访问父类属性,self.父类属性名self.dogs.append(self)  # 在子类里修改父类属性,self.父类属性名=值

# 1.首先创建100个dog:50个SheepDog,50个PoliceDog
# 2.每一轮游戏,随机选出2个dog
# 3.这2个dog互相攻击:dog1先攻击dog2,然后dog2攻击dog1
# 4.任何一方血量变为0即死亡,死亡的dog退出游戏
# 5.最后只剩一个dog,游戏结束,胜利者可以吃鸡from dog import *
import random
import timefor i in range(100):  # 创建100只dogif i % 2 == 0:SheepDog(i + 1)  # from 模块名 import * 模式下,直接用模块里的功能名else:PoliceDog(i + 1)while True:  # 游戏循环# 首先判断是否只有1个dogif len(Dog.dogs) == 1:  # from 模块名 import * 模式下,直接用模块里的功能名winner = Dog.dogs[0]print("												

Python OOP 项目实践:从农药到吃鸡相关推荐

  1. Python基础项目实践之:学生信息管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  2. python基础项目实践之: 学生通讯录管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  3. Python基础项目实践之:面向对象方法模拟简单计算器

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  4. Python基础项目实践之:面向对象方法实现模拟银行管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  5. 32个Python爬虫项目让你一次吃到撑

    今天为大家整理了32个Python爬虫项目. 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1] ...

  6. python爬虫-资源 | 32个Python爬虫项目让你一次吃到撑

    原标题:资源 | 32个Python爬虫项目让你一次吃到撑 作者 | Fendo 来源 | CSDN 今天为大家整理了32个Python爬虫项目. 整理的原因是,爬虫入门简单快速,也非常适合新入门的小 ...

  7. 嵌入式开发使用python开发 +项目实践

    目录 背景 项目实践一 例如:将以下.txt脚本使用python脚本转化 转化Excel后 python 脚本代码(未完成) 背景 最近项目项目中需要将芯片打印flash擦读写时间进行一个统计,思考后 ...

  8. python爬虫项目-32个Python爬虫项目让你一次吃到撑

    今天为大家整理了32个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- ...

  9. Python技术项目实践

    用这个Python库,训练你的模型成为下一个街头霸王! 从世界瞩目的围棋游戏 AlphaGo,近年来,强化学习在游戏领域里不断取得十分引人注目的成绩.自此之后,棋牌游戏.射击游戏.电子竞技游戏,如 A ...

最新文章

  1. ustc小道消息20211215
  2. HDU 1043 Eight(八数码)
  3. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
  4. 阿里巴巴:第四财季净亏损76.54亿元,主要由于反垄断法罚款
  5. c 读取mysql 并显示_c/c++ mysql读取操作实现简单操控电脑
  6. boost::asio的C/S结构笔记
  7. 信息资源管理——总结
  8. 华为的人力资源体系的变革
  9. 计算机 统计学考研,统计学考研科目有哪些
  10. android获取路由器ip地址吗,查看路由器IP地址方法(管理后台地址)
  11. thinkpad重装系统步骤
  12. 深度学习与计算机视觉教程(17) | 深度强化学习 (马尔可夫决策过程,Q-Learning,DQN)(CV通关指南·完结)
  13. java-net-php-python-springboot办公自动化系统计算机毕业设计程序
  14. 第1讲 几种密码技术的简要介绍——《图解密码技术》
  15. 机器学习系列(三)——误差(error),偏差(bias),方差(variance)
  16. Java笔记总结(二)
  17. python连接mysql的几种方式_Python连接MySQL数据库的多种方式
  18. n-queens(n皇后问题)
  19. 字节顺序标记(BOM)详解
  20. 使用pyinstall将python+qt的py文件打包为exe

热门文章

  1. 带撤销贪心——cf1148F好题
  2. Windows 10 设置 Java 环境变量
  3. 什么是IP地址、子网掩码、路由和网关?
  4. 【JS 笔记】比较操作符之大小与记录
  5. 八十第五个冠军(复制和匹配的字符串)
  6. 二叉树2 - 数据结构和算法44
  7. c语言密码强度的判断程序,C语言实现密码强度检测
  8. python idls_Python argparse模块实现模拟 linux 的ls命令
  9. UI设计灵感|逻辑感十足的数据可视化界面设计
  10. PNG免抠软装素材,每个设计师都应该备一份!