Python Day24

一、复习:

类 -(实例化)-> 对象 /实例
a = A()
class A:
country = 'China' #静态属性
def __init__(self,name): #动态属性 方法
self.name = name #对象属性 : 每个对象拥有各自不同的属性

def talk(self): #动态属性
self.name

alex = A('alex')
alex.name
egon = A('egon')
egon.name
alex = A('alex')

60
alex.girlfriend = '凤姐'
alex.talk('alex')


命名空间
类的命名空间和对象的命名空间是分开,且每个对象有独立的命名空间,公用一个类的命名空间

class A:
a = 123
def a(self):
self.a = '123'

组合
什么有什么 的 关系
一个对象的属性 是另一个对象



二、面向对象3:

1.继承:

~继承是类中提供的一种新语法
~面向对象三大特性:封装 继承 多态
~简易的继承
~继承:什么是什么的关系
他大舅他二舅都是他舅
高桌子低板凳都是木头
实例:
#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
#单继承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #调用父类的构函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
 
 
 
s = student('ken',10,60,3)
s.speak()


输出结果
ken 说:  10 岁了,我在读 3 年级



父类 animal
class Animal:
    def __init__(self,name):
        self.name = name

    def eat(self):
        print('%s eating %s'%(self.name,self.food))

    def drink(self):
        print('drinking')

    def sleep(self):
        print('sleeping')

#
class Dog(Animal):
    def __init__(self,name):
        # Animal.__init__(self,name)    #经典类的调用父类中方法的方式
        super().__init__(name)
        self.food = '狗粮'

    def say(self):
        print('汪汪汪')

#
class Cat(Animal):
    def __init__(self,name):
        super().__init__(name)  #新式类
        self.food = '猫粮'

    def say(self):
        print('喵喵喵')

wang = Dog('alex')
ha2 = Dog('二哈')
wang.eat()
ha2.eat()

c = Cat('egon')
c.eat()


输出结果

alex eating 狗粮
二哈 eating 狗粮
egon eating 猫粮
***在继承中
  子类可以继承父类的所有属性和方法
  但是 当父类和子类中有同名方法的时候 一定调用子类的
  如果想使用父类该方法的功能 需要借助super方法
2.super 方法
class A:
  def __init__(self):
   print "enter A"
   print "leave A"

 class B(A):
  def __init__(self):
   print "enter B"
   A.__init__(self)
   print "leave B"

 >>> b = B()
 enter B
 enter A
 leave A
 leave B

使用非绑定的类方法(用类名来引用的方法),并在参数列表中,引入待绑定的对象(self),从而达到调用父类的目的。

  这样做的缺点是,当一个子类的父类发生变化时(如类B的父类由A变为C时),必须遍历整个类定义,把所有的通过非绑定的方法的类名全部替换过来,例如代码段2:

代码2:

class B(C):    # A --> C
  def __init__(self):
   print "enter B"
   C.__init__(self) # A --> C
   print "leave B"

如果代码简单,这样的改动或许还可以接受。但如果代码量庞大,这样的修改可能是灾难性的




后续总结:


  1. super()是一个类名而非函数,super(class, self)事实上调用了super类的初始化函数,产生了一个super对象;


        2 super()机制必须要用新式类,否则会报错;


        3 super()或直接父类调用最好只选择一种形式。









 

posted @ 2017-09-18 18:44  大象和骆驼  阅读(192)  评论(0编辑  收藏  举报