Python全栈之路系列----之-----面向对象

面向对象基本介绍

python编程方式:

  1. 面向过程编程  (流水线式思维)

      优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。

      缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。

  1. 面向函数编程

      封装代码,简化流程 但是本质上没有改变结果   是面向结果编程思想

  1. 面向对象编程  

    优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

    缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,

       面向对象的程序一旦开始就由对象之间的交互解决问题即便是上帝也无法预      

       测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。

名称定义:

  1. 如果函数没有在类中称为‘函数‘
  2. 如果函数在了类中称之为方法

类和对象

python中一切皆为对象,类型的本质就是类,所以,不管你信不信,你已经使用了很长时间的类了

创建一个类:

# class Person: #定义一个类
#     role = ‘person‘ #类的属性
#     def attack(self):#定义方法  就是定义函数   这个函数就是这个类的方法
#         print(‘attack‘)#调用类打印的结果
#         # pass
# print(Person.role)
# print(Person.attack)#现在这个函数是类里面的方法了
  1. 类里面所有的方法就是函数 函数里必须传的参数就是self 这个参数是个形参这个方法函数
  2. 必须定义在类的里面 先定义类的属性 再定义类的方法
  3. 方法是定义在类的里面 但是真正调用类的方法的是 实例化的对像

实例化一个对象

  • 实例化 一个对象 把类的属性 赋予给 对象 就是实例化对象
  • 类加上括号() 得到的结果就是一个实例,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
  • 实例就可以调用类的方法agen=Dog(‘egon‘,‘male‘,250,200)#这就是一个实例化的对象
  • alex.attack() #当你用一个是实例化的对象去掉用一个类的方法的时候,自动的传一个参数,这个参数就是对象本身

class Dog:    role=‘dog‘ #类的属性 , 静态属性   所有的对象 共用|有的属性,可以直接被类调用    def __init__(self,name,sex,aggressive,blood):#可以传默认参数        # 对象属性 属性   用于实例化一个对象之后 调用        self.name=name        self.sex=sex   #性别        self.aggressive=aggressive  #攻击力        self.blood=blood    #血量

    def attack(self):        print(‘%s attack‘%self.name)

agen=Dog(‘egon‘,‘male‘,250,200)alex=Dog(‘alex‘,‘male‘,25,2000)print(agen.name)agen.attack()alex.attack()
 

语法 查看 调用

  语法:对象名 = 类名(参数)

egg = Person(‘egon‘)  #类名()就等于在执行Person.__init__()
#执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
#你可以偷偷的理解:egg = {‘name‘:‘egon‘,‘walk‘:walk}

  调用和查看

print(egg.name)     #查看属性直接 对象名.属性名
print(egg.walk())   #调用方法,对象名.方法名()

小结--定义及调用的固定模式

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

小结

练习

# 练习题
class Porson:
    role=‘Porson‘ #类的属性 , 静态属性   所有的对象 共用|有的属性,可以直接被类调用
    def __init__(self,name,age,sex):#可以传默认参数
        # 对象属性 属性   用于实例化一个对象之后 调用
        self.name=name
        self.age=age
        self.sex=sex   #性别

    def attack(self):
        print(‘%s,%s,%s 上山砍柴‘%(self.name,self.age,self.sex))
    def attack_1(self):
        print(‘%s,%s,%s 开车去东北‘%(self.name,self.age,self.sex))
    def attack_2(self):
        print(‘%s,%s,%s 最爱大保健‘%(self.name,self.age,self.sex))

小明=Porson(‘小明‘,8,‘男‘)
老李=Porson(‘老李‘,99,‘女‘)
# print(agen.name)
小明.attack()
小明.attack_1()
小明.attack_2()
老李.attack()
老李.attack_1()
老李.attack_2()

对象间的交互

  创建多个类 定义类的属性和实例化多个对象,定义多个方法和实现的结果

class Person:  # 定义一个人类
    role = ‘person‘  # 人的角色属性都是人

    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;

    def attack(self,dog):
        # 人可以攻击狗,这里的狗也是一个对象。
        # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
        dog.life_value -= self.aggressivity

class Dog:  # 定义一个狗类
    role = ‘dog‘  # 狗的角色属性都是狗

    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一只狗都有自己的昵称;
        self.breed = breed  # 每一只狗都有自己的品种;
        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
        self.life_value = life_value  # 每一只狗都有自己的生命值;

    def bite(self,people):
        # 狗可以咬人,这里的狗也是一个对象。
        # 狗咬人,那么人的生命值就会根据狗的攻击力而下降
        people.life_value -= self.aggressivity

egg = Person(‘egon‘,10,1000)  #创造了一个实实在在的人egg
ha2 = Dog(‘二愣子‘,‘哈士奇‘,10,1000)  #创造了一只实实在在的狗ha2
print(ha2.life_value)         #看看ha2的生命值
egg.attack(ha2)               #egg打了ha2一下
print(ha2.life_value)         #ha2掉了10点血

egon大战哈士奇

战斗吧

import random
class Person:
    role=‘游戏人物:‘
    def __init__(self,name,lifevalue,aggr):
        self.name=name
        self.lifevalue=lifevalue
        self.aggr=aggr
        info_person = ‘‘‘
        ==================人物信息=====================
                        名称:%s
                        血量:%s
                        攻击:%s
        ===============================================
            ‘‘‘ % (name, lifevalue, aggr)
        print(info_person)
    def attack(self,se):
        print(‘%s平A了%s一下‘%(self.name,se.name))
        life=int(int(se.lifevalue) - int(self.aggr))
        se.lifevalue=life
        Monster(se.name,life,se.aggr)

class Monster:
    role=‘怪物:‘
    def __init__(self,name,lifevalue,aggr):
        self.name=name
        self.lifevalue=lifevalue
        self.aggr=aggr
        info_dog=‘‘‘
        ==================怪物信息=====================
                        名称:%s
                        血量:%s
                        攻击:%s
        ===============================================
        ‘‘‘%(name,lifevalue,aggr)
        print(info_dog)
    def attack(self,se):
        print(‘%s反咬了%s一口‘%(self.name,se.name))
        life=se.lifevalue - self.aggr
        se.lifevalue = life
        Person(se.name,life,se.aggr)

class Run:
    def __init__(self,name,lifevalue,aggr):
        self.name=name
        self.lifevalue=lifevalue-10
        self.aggr=aggr
        info=‘‘‘
        ==================人物信息=====================
                        名称:%s
                        血量:%s
                        攻击:%s
        ===============================================
        ‘‘‘% (name,self.lifevalue, aggr)
        print(info)

monster_list=[(‘二哈‘,53,2),(‘史莱姆‘,53,5),(‘炸弹‘,10,100)]
person_list=[(‘egon‘,50,5),(‘alex‘,100,3),(‘群主‘,30,8)]
p_n_l=[]
for i in person_list:
    p_n_list=‘‘‘
            ==================游戏人物=====================
                            名称:%s
                            血量:%s
                            攻击:%s
            ===============================================
            ‘‘‘%(i[0],i[1],i[2])
    p_n_l.append(i[0])
    print(p_n_list)
p_choice=input(‘选择游戏人物:‘)
if p_choice in p_n_l:
    for line in person_list:
        if p_choice in line:
            person=Person(*line)

def fighting():
    print(‘开始游戏!‘)
    Tag=True
    while Tag:
        print(‘遇到怪物!战斗or逃跑‘)
        monster_c = random.choice(monster_list)
        monster = Monster(*monster_c)
        fight_cmd=input(‘选择指令:‘)
        if fight_cmd==‘战斗‘:
            tag=True
            while tag:
                person.attack(monster)
                monster.attack(person)
                ran=random.randint(10, 700)
                if person.lifevalue<=0:
                    print(‘%s获得胜利  %s吐血身亡‘%(monster.name,person.name))
                    tag=False
                    f_cmd=input(‘继续or退出‘)
                    if f_cmd==‘退出‘:
                        Tag=False
                elif monster.lifevalue<=0:
                    print(‘%s获得胜利   获得金钱:%s‘%(person.name,ran))
                    f_cmd = input(‘继续or退出‘)
                    if f_cmd == ‘退出‘:
                        Tag = False
                    tag = False

        elif fight_cmd==‘逃跑‘:
            print(‘小伙子,你太怂了‘)
            print(‘逃跑成功! 血量-10‘)
            Run(person.name,person.lifevalue,person.aggr)
            Tag = False
        else:
            print(‘指令不存在!‘)
fighting()的

打野怪

时间: 2024-10-07 14:14:34

Python全栈之路系列----之-----面向对象的相关文章

Python全栈之路系列----之-----面向对象4接口与抽象,多继承与多态)

接口类与抽像类 在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念 编程思想 归一化设计: 1.接口类 不实现具体的方法,并且可以多继承 2.抽象类 可以做一些基础实现,并且不推荐多继承 编程的几类原则: 开放封闭原则:对扩展示开放的,对修改是封闭的依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该应该依赖细节:细节应该依赖抽象.换言之,要针对接口编程,而不是针对实现编程接口隔离原则:使用多个专门的接口,而不使用单一的总接口.

2Python全栈之路系列之面向对象进阶及类成员

Python全栈之路系列之面向对象进阶及类成员 再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:     def bar(self):         print("BAR")         self.f1()          class B(A):     def f1(self):         print("B")          class C:     def 

7Python全栈之路系列之面向对象运算符重载

Python全栈之路系列之面向对象运算符重载 运算符重载的概念如下: 运算符重载让类拦截常规的Python运算: 类可重载所有Python表达式运算符: 类也可重载打印.函数调用.属性点号运算等内置运算: 重载是类实例的行为想内置类型: 重载是通过提供特殊名称的类方法来实现的: 常见的运算符重载方法 方法 重载 调用 __init__ 构造函数 对象建立:X = Class(args) __del__ 解析函数 X对象收回 __add__ 运算符+ 如果没有__iadd__,X+Y,X+=Y _

Python全栈之路系列之赋值与运算符

Python全栈之路系列之赋值与运算符 在继续下面的文章之前我们先来浏览一下Python为我们提供的几种运算符,定义两个变量,分别是a和b,a的值是10,b的值是20. 算术运算符 运算符 描述 实例 + 加,两个对象相加 a+b=30 - 减,两个对象相减,可能会得到负数 a-b=-10 * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200 / 除,两个对象相除 b/a=2 % 取膜,返回除法的余数 b%a=0 ** 幂,返回x的y次幂 a**b=10000000000000000

Python全栈之路系列----之-----re模块(正则表达式)

正则表达式并不是python中的一部分,正则表达式适用于处理字符串的强大工具,拥有自己独特的语法,以及独立的处理引擎.在提供了正则表达式的语言中都它的语法是都一样的 re模块本质上和正则表达式没有一毛钱的关系,re模块是python提供给我们方便操作正则的工具而已 正则表达式概念 使用单个字符串规则来描述匹配一系列符合某个句法规则的字符串 是对字符串操作的一种逻辑公式 应用场景:处理文本和数据 正则表示是过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:否则匹配失败 正

1Python全栈之路系列之面向基础

Python全栈之路系列之面向对象基础 面向对象基本介绍 Python编程方式: 面向过程编程 面向函数编程 面向对象编程 名称定义: 如果函数没有在类中称之为函数 如果函数在类中称之为方法 创建类 # 创建一个类,类名是Class_basis class Class_basis:     # 在类里面创建了一个方法ret,类里面的方法必须加一个self关键字     def ret(self):         # 当调用方法的时候输出ret         print("ret")

3Python全栈之路系列之基于socket实现文件上传

Python全栈之路系列之基于socket实现文件上传 发布时间:2017年3月16日 00:04 浏览(106) 评论(0) 分类:Python 前言 此处没有前言 粘包 在实现发送文件功能之前我们先来理解下粘包的问题,下面有两张图,我觉得很清晰的就可以理解到了. 正常情况下发送文件 第一步: 客户端把获取到的文件总大小(size=65426)先放到缓冲区,然后发送给服务端 第二步: 此时客户端接收到的文件总大小就是65426 粘包的问题下发送文件 第一步: 客户端把获取到的文件总大小(siz

6Python全栈之路系列之MySQL存储过程

Python全栈之路系列之MySQL存储过程 存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行. 存储过程过接收的参数 参数 描述 in 仅用于传入参数用 out 仅用于返回值用 inout 既可以传入又可以当作返回值 创建存储过程 创建一个简单的存储过程 -- 修改SQL语句的结束符为% delimiter % -- 创建这个存储过程先删除 DROP PROCEDURE IF EXISTS proc_p1 % CREATE PROCEDURE proc_

3Python全栈之路系列之MySQL表内操作

Python全栈之路系列之My SQL表内操作 先创创建一个表用于测试 -- 创建数据库 CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 创建表 CREATE TABLE `tb` (   `id` int(5) NOT NULL AUTO_INCREMENT,   `name` char(15) NOT NULL,   `alias` varchar(10) DEFAULT NULL,   `ema