面向对象

面向对象

  一个类可以没有__init__ 方法

  在没有__init__的情况下,实例化经历了哪些步骤?

    1.创建一个空间给对象

    2.将这个空间的地址返回

  类中的代码是在实例化之前执行的

  在实例化的过程中,开辟了属于对象的一块空间

  对象可以查看类的静态属性,但是不能修改

  并且一旦修改,就不能取到类当中的内容了(除非手动删除这个修改的属性)

  所有的静态属性的修改,都应该由类名来完成,而不应该使用对象名来完成

  如果静态变量是一个不可变数据类型,那么只要对象修改这个数据,就相当于在对象的空间中新建

  如果静态变量是一个可变数据类型,那么对象修改这个容器中的元素,相当于修改类的空间中的元素

  如果静态变量是一个可变数据类型,那么对象直接对这个变量重新赋值,相当于修改对象自己空间中的元素

  结论

    只要是静态变量,就用类名去修改,永远修改成功,并且所有的对象都共享这个变量

  总结

    对象的命名空间:类指针\对象的所有属性

    类的命名空间:方法和(静态属性\字段)

    对象在寻找名字的时候:先找对象自己内存空间中的,找不到就去类的命名空间中寻找

    类中的名字是什么时候写入内存的

      代码从上到下执行的时候就已经写入的.一定是在实例化之前

    静态变量:尽量用类名去操作

  什么是组合

    一个类对象的属性是另外一个类的对象

面向对象的三大特征

所有的面向对象的语言 三大特征 通用的

继承:为了解决类与类之间代码重复的问题

 类的继承的语法

  单继承

    在定义类的时候加(),括号里面写的就是继承的类

    class A:pass

    class B(A):pass

    A类:父类 基类 超类

    B类:子类 派生类

  多继承(Python支持  java不支持)

    class C:pass

    class D:pass

    class E(C,D):pass

    E继承了CD

子类可以继承父类的方法和属性

继承

  子类调用方法,如果子类自己有,用自己的,用了自己的就不用父类的

  如果子类自己没有才调用父类的

  如果子类有个性化的父类没有的方法,可以单独定义在子类中

  只有子类能够使用父类中的方法,父类不可以使用子类中的方法

当某一个方法,父类和子类都拥有的时候,那么在子类的方法中,调用父类的同名方法就会用到

    1  父类名.方法名(self,..)

    2  super().方法()

 

class Animal:
    def __init__(self,name,kind,language):
        self.name=name
        self.kind=kind
        self.language=language
    def eat(self):
        print('%s is eat'%self.name)
    def drink(self):
        print('%s is drink'%self.name)
    def yell(self):
        print('%s is yell '%self.name)
    def sleep(self):
        print('%s is sleep'%self.name)
class Cat(Animal):
    def climb(self):
        print('%s can climb'%self.name)
    def sleep(self):
        Animal.sleep(self)
        print('团着睡')
class Dog(Animal):
    def yell(self):
        super().yell()
        print('大声叫')
    def sleep(self):
        super().sleep()
        print('站着睡')
xiaohua=Cat('小花','金吉拉','喵喵')
xiaohei=Dog('小黑','土狗','旺旺')
xiaohua.sleep()
xiaohei.sleep()


小花 is sleep
团着睡
小黑 is sleep
站着睡

  

  

 

  

 

 

 

  

 

posted @ 2018-11-20 19:39  z1115230598  阅读(86)  评论(0编辑  收藏  举报