zoukankan      html  css  js  c++  java
  • python--面向对象组合

    面向对象的命名空间  

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

    面向对象的命名空间

    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)
  • 相关阅读:
    15,scrapy中selenium的应用
    14,UA池和代理池
    13,scrapy框架的日志等级和请求传参
    12,scrapy框架之post请求
    11,scrapy框架持久化存储
    10,Scrapy简单入门及实例讲解
    09.移动端数据爬取
    08.Python网络爬虫之图片懒加载技术、selenium和PhantomJS
    07.验证码处理
    vue的ref与$refs
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7541356.html
Copyright © 2011-2022 走看看