初识面向对象

初识面向对象
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 全球长方形的周长和面积

 

 







 
posted @ 2019-03-17 20:45  红领巾***  阅读(124)  评论(0编辑  收藏  举报