面向对象初识

什么是模块?什么是包
sys.path默认会添加一个当前执行的文件所在的目录
模块不能被重复导入,不能循环引用
    from...import
    import
    只有import后面的名字会出现在全局命名空间里
__name__
    直接执行一个文件的时候,打印的是这个文件里的变量名__name__
        都是字符串__main__
    引用一个模块,这个模块里的变量名__name__
        都是模块名
包
从包中导入模块
        from import 精确到模块
    import  文件夹...模块 精确到模块
导入包 相当于执行了这个包的__init__文件
    如果需要在导入包之后使用模块中的内容,需要自己在__init__文件中做一些导入操作
    导入有两种方式
        绝对导入  如果被导入的包和文件相对位置改变了,绝对导入的路径会失效
        相对导入  用到了相对导入的文件不能直接执行
面向对象
人狗大战
角色: 人 狗

人:
名字
性别
血量 hp
攻击力 ad

名字
品种
血量
攻击力
def Person(name,sex,hp,ad):
    创造了一个模子
    约束了一个人必须拥有的属性
    规范了这些属性的名字
    简化了用户的操作
    person={
        'name':name,
        'sex':sex,
        'hp':hp,
        'ad':ad
    }
    def attack(dog):
        狗掉血,是人的攻击力
        print('%s攻击了%s' % (person['name'],dog['name']))
        dog['hp']-=person['ad']
        print('%s掉了%s 点血,%s剩余血量%s' % (dog['name'],person['ad'],dog['name'],dog['hp']))
    person['attack']=attack
    return person

def Dog(name,kind,hp,ad):
    dog={
        'name':name,
        'kind':kind,
        'hp':hp,
        'ad':ad
    }
    def bite(person):
        print('%s咬了%s' % (dog['name'],person['name']))
        person['hp']-=dog['ad']
        print('%s掉了%s 点血,%s剩余血量%s' % (person['name'],dog['ad'],person['name'],person['hp']))
    dog['bite']=bite    #d2 将bite 赋值给dog['bite']
    return dog  # d3 将dog 返回给函数的调用者 taibai= Dog('哮天犬','teddy',100,50)

alex=Person('alex',None,10,1)
egon=Person('egon',None,20,2)
taibai=Dog('哮天犬','teddy',100,50)    #d1 调用def Dog(name,kind,hp,ad):  #d4 taibai =dog
alex['attack'](taibai)
taibai['bite'](alex)    #d5 taibai['bite'](alex)=bite(alex)
面向对象的思路
不着急直接去计算/操作代码获取结果
    从一个大问题中,到要描述的角色
    将角色的属性和行为抽象出来
    形成一个模子
    后期用到角色的时候,都围绕这个模子来操作
 一类抽象的事物,是描述一类事物有哪些的属性或者行为,但是不具体---模子
实例=对象 就是一个依托于类的规范存在的,被赋予了具体属性的实际存在的物体
实例化 由一个类产生一个对象/实例的过程

桌子 类
实例/对象
创造一个函数 用 def
创造一个类 用 class
class Person :
    Country='China'     #静态属性
    def __init__(self,name,sex,hp,ad):
        print('self--->',self)#self---> <__main__.Person object at 0x0000021153B5AE48>
    def func(self):
        print('执行了func函数')

obj=Person('alex',None,10,1)    #对象=类名()
print('obj-->',obj)#obj--> <__main__.Person object at 0x0000021153B5AE48>  self 和obj公用一个内存空间
Person 是一个类名
Person 中可以放两个东西:
静态属性 变量
动态属性(方法) 函数,自带一个叫做self的形参
类名可以做两件事情
查看静态属性和动态属性
print(Person.Country)   #变量的值
print(Person.func)  #打印的是函数的地址
Person.func(0)  #Person调用方法:self 也是一个需要传的参数,Person.func(0)调用了func函数
print(Person.__dict__)#将Person类中的变量用字典的方法打印出来
    创造一个对象object  对象=类名()
首先要创造一个对象
会自动触发__init__,将创造出来的对象的地址传给self
执行init中的代码
将self指向的地址在返回给调用者

面向对象思路写人狗大战
class Person:
    def __init__(self,name,sex,hp,ad):
        self.user=name
        self.sex=sex
        self.hp=hp
        self.ad=ad
    def attack(self,dog):
        print('%s攻击了%s' % (self.user,dog.user))
        dog.hp-=self.ad
        print('%s掉了%s血,当前血量为%s' % (dog.user,self.ad,dog.hp))

class Dog:
    def __init__(self,name,kind,hp,ad):
        self.user=name
        self.kind=kind
        self.hp=hp
        self.ad=ad
    def bite(self,person):
        print('%s攻击了%s' % (self.user,person.user))
        person.hp-=self.ad
        if person.hp>0:
            print('%s掉了%s血,当前血量为%s' % (person.user,self.ad,person.hp))
        else:
            print('%s血量为0,%s胜利,gime over'% (person.user,self.user))
alex=Person('alex',None,10,1) #实例化
egon=Person('alex',None,20,2) #实例化
taibai=Dog('哮天犬','teddy',100,20)  #实例化
alex.attack(taibai)   #<==>Person.attack(alex,taibai)
taibai.bite(alex)     #<==>Dog.bite(taibai,alex)
Person  Dog 类
alex egon taibai 对象 实例
对象名可以调用静态属性
对象名可以调用方法
class Person:
    Country='China'
    def __init__(self,name):
        self.name=name
    def attack(self):
        print('attack')

静态属性
动态属性 : 特殊的__init__方法,attack 方法
对象
对象属性 name
class Person:
    Country='China'
    def __init__(self,name):
        self.name=name

alex=Person('alex')
egon=Person('egon')
alex.Country='印度'   #往alex的对象内存中存了一个印度
print(alex.Country)     #印度
print(egon.Country)  #China
print(Person.Country)   #China

class Person:
    Country=['China']
    def __init__(self,name):
        self.name=name

alex=Person('alex')
egon=Person('egon')
alex.Country[0]='印度'#将默认参数Country=['China']改为Country=['印度']
print(Person.Country)   #['印度']
print(egon.Country) #['印度']

首先,静态变量之所以出现:所有的对象都共享的值
调整静态变量的值,直接用类名去调整是最准确的
对象对一个静态变量重新赋值的过程
实际上是在对象所在的内存空间中添加了一个同名属性而已
方法并没有真正存储在对象的空间中
之所以能找到,是因为每个对象在创建之初都有以一个执行类的指针

类名
查看,修改静态属性
实例化
对象名
查看对象的属性
调用方法
对象使用名字的特点: 先用自己的,自己没有的话用类的


posted @ 2018-05-27 18:29  老虎死了还有狼  阅读(111)  评论(0编辑  收藏  举报