• 初识面向对象


    初识面向对象
    def Person(name,blood,aggr,sex):   #人模子
        person = {
             'name': name,
             'blood': blood, #血量
             'aggr':aggr,    #攻击力
             'sex' : sex,
        }
        #人的攻击技能
        def attack(dog):
            dog['blood'] -= person['aggr']
            print('%s被打了,掉了%s的血' % (dog['name'], person['aggr']))
        person['attack'] = attack
        return person
    写Person函数的优点:人物更加规范,代码精简了,方便增加人物,方便修改
    def Dog(name,blood,aggr,kind):  #狗模子
        dog = {
            'name': name,
            'blood':blood,  # 血量
            'aggr': aggr,  # 攻击力
            'kind': kind
        }
        #狗的技能 咬人
        def bite(person):
            person['blood'] -= dog['aggr']
            print('%s被咬了,掉了%s的血' % (person['name'], dog['aggr']))
        dog['bite'] = bite   #将函数名放到字典里
        return dog
    
    alex = Person('金老板',100,10,'不详')
    taidi = Dog('小白',200,500,'泰迪')
    wawa = Dog('星星',100,300,'金巴吉娃娃')
    
    taidi['bite'](alex)  #狗咬人
    alex['attack'](wawa)  #人打狗
    人狗大战游戏

     Dog函数和Person函数,但是定义了一类事物,直到调用了函数,赋值了之后才真的有了一个实实在在的人物或者狗狗

    面向对象编程
    ◆所谓模子 就是 类
    ◆alex,泰迪,是对象
    ◆类是抽象的,可以知道有什么属性,有什么技能,但是不知道具体的值
    ◆对象是具体的,有具体的值,属性和技能但是根据类来规范的
    ◆先有类才有对象
    自定义类
    class 类名 :
        属性 = 'a'
    #通过点来查看属性
    print(类名.属性)
    #类名的作用:操作属性,查看属性
    class Person: # 类名
        country = "China"   # 创造了一个只要是这个类就一定有的属性,叫做类属性,也叫静态属性
    
        def __init__(self,*args): # 初始化方法  self是对象,是一个必须传的参数
            # self就是一个可以存储很多属性的打字典,只不过往字典里添加属性的方式发生了一些变化
            self.name = args[0]
            self.blood = args[1]
            self.aggr = args[2]
            self.sex = args[3]
            print(self.__dict__) #{'aggr': 10, 'blood': 100, 'name': '金老板', 'sex': '女'}
    
        def walk(self,n):  # 方法  一般情况下必须传self,且必须写再第一个位置,后面还可以传其他参数
            #  #self参数是alex传过来的,,,n是走的步数,由alex.walk(6)中的实参传进来的
            print('%s走走走,走了%s步'%(self.name,n))
    
    alex = Person('金老板',100,10,'')
    print(alex) #<__main__.Person object at 0x000002C20A443CC0>
    print(alex.name) #金老板
    print(alex.__dict__) #查看所有属性{'aggr': 10, 'blood': 100, 'name': '金老板', 'sex': '女'}
    self 和 alex的内存地址是一样的
    
    Person.walk(alex,6)  #调用方法   类名.方法名(对象)
    alex.walk(6)   #等价于 Person.walk(alex)   是Person.walk(alex)的简写    即对象.方法名()
    
    #__dict__
    print(Person.__dict__) #得到的是Person类中的所有方法
    print(Person.__dict__['country'])  # 得到的是china
    
    print(alex.__dict__['name'])   # 金老板
    # 修改属性值由两种方法 但是推荐使用第一种  alex.name = '柠檬'
    alex.name = '柠檬'
    print(alex.name)
    alex.__dict__['name'] = '二哥'
    print(alex.__dict__)
    # 增加属性
    alex.age = 50
    print(alex.__dict__)

    类名+() 就是对象

    ◆过程:
    类名() 首先会创造一个对象,创建了一个self变量
    调用init方法,类名括弧里的内容会被这里接收
    执行init方法
    返回self
    ◆对象能做的事:
    查看属性
    调用方法
    __dict__ 对于对象的增删改查操作都可以通过的语法进行
    ◆类名能做的事:
    调用类拿到对象的过程叫做实例化 alex = Person('金老板',100,10,'女')
    实例化
    调用方法 : 只不过要自己传递self参数 Person.walk(alex,6) #调用方法 类名.方法名(对象)
    调用类中的属性 print(Person.country) 类名调用属性 也就是调用静态属性
    对于类中的名字只能看 不能操作

    使用面向对象的情况:
    ◆当有几个函数需要反反复复传入相同参数的时候,就可以考虑面向对象,这些参数都是对象的属性
    ◆非常明显的处理一类事物的,这些事物都具有相似的属性和功能
    class Dog:
        def __init__(self,*args):
            self.name = args[0]
            self.blood = args[1]
            self.aggr = args[2]
            self.kind = args[3]
        def bite(self,person): # 狗咬人,人掉血
            person.blood -= self.aggr
            print('%s被打了,掉了%s的血' %(jin.name,self.aggr))
    class Person:
        def __init__(self,name,blood,aggr,sex):
            self.name = name
            self.blood = blood
            self.aggr = aggr
            self.sex = sex
        def attack(self,dog):
            dog.blood -= self.aggr
            print('%s被打了,掉了%s的血' % (taidi.name, self.aggr))
    
    taidi = Dog('小白',200,260,'taidi')
    jin = Person('金老板',100,30,'')
    taidi.bite(jin)  #金老板被打了,掉了260的血
    print(jin.blood) # -160
    jin.attack(taidi)# 小白被打了,掉了30的血
    print(taidi.blood)#170
    栗子1:用面向对象的方法写人狗对战
    #小明,10岁,男,上山去砍柴
    #小明,10岁,男,开车去东北
    #小明,10岁,男,最爱大保健
    #老李,90岁,男,上山去砍柴
    #老李,90岁,男,开车去东北
    #老李,90岁,男,最爱大保健
    #老张…
    
    
    class Person:
        def __init__(self,*args):
            self.name = args[0]
            self.age = args[1]
            self.sex = args[2]
        def shangshan(self):
            print('%s,%s岁,%s,上山去砍柴'%(self.name,self.age,self.sex))
        def drive(self):
            print('%s,%s岁,%s,开车去东北'%(self.name,self.age,self.sex))
        def favor(self):
            print('%s,%s岁,%s,最爱大保健'%(self.name,self.age,self.sex))
    xiaoming = Person('小明','10岁','')
    xiaoming.shangshan()
    xiaoming.drive()
    xiaoming.favor()
    laoli = Person('老李','90岁','')
    laoli.shangshan()
    laoli.drive()
    laoli.favor()
    栗子2:用面向对象的思想在终端输出如下信息
    #属性 半径 ,两个方法,
    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        def perimeter(self):
            return  2 * pi * self.r
        def area(self):
            return  self.r * self.r * round(pi,2)
    l = Circle(6)
    print(round(l.perimeter(),2))
    print(round(l.area()),2)
    栗子3:circle 求周长和面积
    class Circle:
        def __init__(self,l,h):
            self.l = l
            self.h = h
        def perimeter(self):
            return  (self.l+self.h) * 2
        def area(self):
            return  self.l * self.h
    l = Circle(4,2)
    print(l.perimeter())
    print(l.area())
    栗子4 全球长方形的周长和面积

     







     
  • 相关阅读:
    asp后台读id设置样式
    js,需要更多源字符
    列名无效
    asp,对待绑定数据加序号列(DataSet)
    ashx 绝对路径得到物理路径
    方法执行一次js
    小细节
    Spring oauth大致流程
    第六章 分支语句和逻辑运算符
    第七章 函数
  • 原文地址:https://www.cnblogs.com/twinkle-/p/10548771.html
Copyright © 2020-2023  润新知