面向对象的命名空间  

类中的方法
   类中的静态属性
   对象的属性
类的组合应用

面向对象的命名空间

 

class A:
     country='中国'
a=A()
a.name='alex'
print(a.name)      #结果是alex  想要添加属性可以这么添加
b=A()
print(b.name)       #结果是没有name的属性

对象中有地址簿来调用类的方法,表现内存不同,不过实际调用内存相同
对象和类调用动态属性表现的地址不一样,实际一样
静态属性完全一样地址

class A:
     country='印度'
a=A()
b=A()
a.country='中国'
print(a.country)    #中国
print(A.country)    #印度
print(b.country)    #印度

对于关于类的静态属性:
    如果类.属性 调用的就是类中的属性
 对象.属性  先从自己的内存空间找名字,找到了用自己的,没找到就用类的,类里没有报错
 关于类的动态属性:
 这个方法本事就存在类中,并不会存在对象的内存中
 在对象调用类中的方法的时候,要依赖于一个地址簿,去类中寻找对应的方法
 关于对象的属性
 对象的属性就存在对象的命名空间中
 只能被对象调用、修改
 不能被类调用   

面向对象组合 

一个对象的属性是另一个对象
 可以做到解耦,可以用其他对象做属性
 什么有什么的关系
命名空间
类的命名空间和对象的命名空间是分开的,且每个对象都有独立的命名空间,公用一个类的命名空间
继承:
继承是一种新的语法,是类中提供的一种新语法
面向对象三大特性:封装、继承、多态
封装:类里面的属性,其他类或东西没法用
继承:什么是什么的关系

class Animal:        #父类,超类
    def eat(self):
        print('eating')
    def drink(self):
        print('drinking')
    def sleep(self):
        print('sleeping')
class Dog(Animal):  #子类,派生类  继承方法类加括号后面放继承了谁
    pass
class Cat(Animal):  #子类,派生类
    pass

抽象从小的范围往大的范围走
继承是从大的范围往小的范围走

class Dog(Animal,Bnimal):  #可以继承多个
       pass
class Animal:
    def eat(self):
        print('eating%s'% self.food)  #self谁调用就是谁
    def drink(self):
        print('drinking')
    def sleep(self):
        print('sleeping')
class Dog(Animal):
    print('旺旺旺')
class Cat(Animal):
    print('喵喵喵')

w=Dog()
c=Cat()
w.food='狗粮'   #所以可以这么用创建一个food
w.eat()      #然后eat里面的self.food就是调用的那个

 父类子类都有__init__的话,先调用自己的
 想要调用父类__init__的话,用super方法,参数直接传,不用写self
 super().__init__()
 super就是执行父类
 类外面执行的话super()默认不调自己的,调父类的括号前面是类名,后面对象
 如果继承多个类,就找能找到的第一个父类里面的方法

 class A:
    def hahaha(self):
        print('A')
class C:
    def hahaha(self):
        print('C')
class B(A,C):
    def hahaha(self):
     C.__init__(self,name)        #经典类调用父类中方法的方式
        super().hahaha()             #新式类
        print('B')

b=B()
b.hahaha()
super(B,b).hahaha()

在继承中
子类可以继承父类的所有属性和方法
但是  当父类和子类中有同名方法的时候 一定调用子类的
如果想使用父类该方法的功能,需要借助super方法4
对象可以调用自己本类和父类的所有方法和属性,先调用自己的,自己没有才调父类的
谁(对象)调用方法,方法中的self就指向谁
例子

class Dong:
    def __init__(self,name,food):
        self.name=name
        self.food=food
        self.family='地上'
    def eat(self):
        print('eat')
    def drink(self):
        print('drink')
    def sleep(self):
        print('sleep')
    def say(self):
        print('say')

class Dog(Dong):
    def __init__(self,name,food):
        super().__init__(name, food)
    def swim(self):
        print('%sswim,吃%s,住%s'%(self.name,self.food,self.family))
class Bird(Dong):
    def __init__(self,name,food):
        super().__init__(name, food)
        self.family = '天上'
    def fly(self):
        print('%sfly,吃%s,住在%s'%(self.name,self.food,self.family))
wangcai=Dog('旺财','狗粮')
bage=Bird('八哥','花籽')
wangcai.swim()
bage.fly()

例子2:

class Shuxing:
    def __init__(self,name,blood,aggr):
        self.name=name
        self.blood=blood
        self.aggr=aggr
class Person(Shuxing):
    def __init__(self,name,blood,aggr,qian):
        super().__init__(name,blood,aggr)
        self.qian=qian               派生属性
    def attack(self,dog):             派生方法
        print('%s攻击了%s'%(self.name,dog.name))
        dog.blood-=self.aggr
class Dog(Shuxing):
    def __init__(self,name,blood,aggr,pz):
        super().__init__(name,blood,aggr)
        self.pinzhong=pz             派生属性
    def attack(self,person):          派生方法
        print('%s攻击了%s'%(self.name,person.name))
        person.blood -= self.aggr
        print(person.blood)
haijiao=Person('ren',2000,100,200)
jifao=Dog('fd',50000,200,'金毛')
haijiao.attack(jifao)
jifao.attack(haijiao)

 

posted on 2017-09-18 08:18  Symoon_g  阅读(246)  评论(0编辑  收藏  举报