pythonx1_面向对象2

面向对象

高级

===

  1. 动态添加属性

    • python可以动态为对象绑定属性,但是不会影响到同类的其他对象。

          class Person:
              pass
          p1=Person()
          p2=Person()
          p1.gender='male'
          print(p1.gender)
          print(p2.gender) #'Person' object has no attribute 'gender'
      
      • 使用slots限制实例的属性.比如,只允许对Student实例添加name和age属性。

      使用slots限制实例的属性只对当前对象起作用,对子类的对象不起作用

          class Person(object):
              __slots__=('name','age')
          
          p1=Person()
          print(dir(p1))
          # 这是看到p1对象里已经存在name和age属性了
          try:
              p1.gender = 'female'
          except Exception:
              print('使用__slots__限制实例的属性')
      
  2. 删除属性

```
        class Person:
                def __init__(self):
                    self.age=1
        p1=Person()
        p2=Person()
        p1.gender='male'
        
        Person.nation='china'
        
        del p1.gender
        
        del p1.nation #error nation属于类的,不可以通过对象删除
        
        del Person.nation
        
        del p1.age #这是可以的
    
```

类属性也可以通过del动态删除
  1. 利用函数动态绑定

        #该语句只能添加属性,不能添加方法
        setattr(ee2, 'age', 8) # 添加属性 'age' 值为 8
        getattr(ee1, 'age')     # 返回 'age' 属性的值
        hasattr(ee1, 'age')     # 如果存在 'age' 属性返回 True。
        delattr(ee1, 'age')     # 删除属性 'age'
    
  2. 动态绑定方法

    • 动态为对象绑定方法

          from types import MethodType
          class Person:
              pass
          def displayMe(self):
              print('my genderis:', self.gender)
          # 给一个实例绑定的方法,对另一个实例是不起作用的:
          p1.dispalyMe=MethodType(displayMe,p1)
          p1.dispalyMe()
      
    • 通过动态给类增加属性和方法,可以实现所有对象都增加了属性和方法

          Person.gender='male'
          
          #定义一个类方法
          @classmethod
          def displayMe(cls):
              print('my genderis:', self.gender)
          
          #定义一个静态方法
          
          @staticmethod
          def showMe():
              print('呵呵...')
          Person.displayMe=displayMe
      
  3. 私有属性

    1、 _xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入。

    Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范.

    2、 __xx 双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

    3、 __xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , import或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)

    python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰.但是可以在变量前面加上两个下划线"",这样的话函数或变量就变成私有的.这是python的私有变量轧压(这个翻译好拗口),英文是(private name mangling.) **情况就是当变量被标记为私有后,在变量的前端插入类名,再类名前添加一个下划线"",即形成了_ClassName__变量名.

        class pub():
            # protected类型的变量和方法 在类的实例中可以获取和调用
            _name = 'protected类型的变量'
            __info = '私有类型的变量'
            def _func(self):
                print("这是一个protected类型的方法")
            def __func2(self):
                print('这是一个私有类型的方法')
            # 如果想要在实例中获取到类的私有类形变量可以通过在类中声明普通方法,返回私有类形变量的方式获取
            def get(self):
                return(self.__info)
                
        p=pub()
        p.__info # error 因为__info是私有变量只有在类内部才可见,所以要用内部方法
    

    复习:

    Python内置类属性

     __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
     __doc__ :类的文档字符串
     __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
     __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
    
  4. 只读属性

@ property 作用就是采用访问属性的方式访问函数。

    class Car:
        __wheels=4
    
        @property
        def wheels(self):
            return self.__wheels

@property可以把方法变为属性,

    class Car:
        __wheels=4
        __voice='didi'
        def __init__(self,color):
            self.color=color
            self.speed=80
        @property
        def run(self):
            print('i can run %d speed'%self.speed)
    
        @run.setter
        def run(self,wh):
            self.speed=wh


  ​ 
  ​ 
    car1=Car('blue')
    
    print(car1.color)
    car1.run=120
    car1.run

**这个属性是不可以通过del car1.run 来删除的。因为他本来就不是一个属性**




​ ```
@run.deleter

        def run(self):
            del self.speed
            print("你的车轮已经被拆除...")
    ```
  1. 静态方法

    普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。

     class Car:
     __wheels=4
     __voice='didi'
     def __init__(self,color):
         self.color=color
     @property
     def wheels(self):
         return self.__wheels
    
     #静态方法在类中也不需要传入 self参数
     @staticmethod
     def wash():
         print('i am washing')
    
  2. 类方法

    通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

     class Car:
     __wheels=4
     __voice='didi'
     def __init__(self,color):
         self.color=color
     @property
     def wheels(self):
         return self.__wheels
     
     @classmethod
     def dudu(cls):
         print(cls.__voice)
         
     @staticmethod
     def wash():
         print('i am washing')
    

多态

  1. 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)

  2. 声明抽象方法

     import abc
     @abc.abstractmethod
    
  3. 声明抽象类

     import abc
     class Animal(metaclass=abc.ABCMeta):
    
  4. 通过继承实现

     import abc
     class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
         @abc.abstractmethod
         def talk(self):
             pass
      
     class People(Animal): #动物的形态之一:人
         def talk(self):
             print('say hello')
      
     class Dog(Animal): #动物的形态之二:狗
         def talk(self):
             print('say wangwang')
      
     class Pig(Animal): #动物的形态之三:猪
         def talk(self):
             print('say aoao')
    
  5. 什么是多态性(注意:多态与多态性是两种概念)

    多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

     ##多态性:定义统一的接口,#对于使用者来说,自己的代码根本无需改动
     def run(obj):
         if isinstance(obj, Animal):
             obj.talk()
    
    
     run(per)
     run(dog)
     run(pig)
    
  6. 多态的优势

    1. 增加了程序的灵活性

      以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如run(animal)

    2. 增加了程序额可扩展性

      通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用run(animal)去调用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 抽象类 什么是抽象类 与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的...
    go以恒阅读 601评论 0 3
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,743评论 0 8
  • 初识面向对象 楔子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战...
    go以恒阅读 920评论 0 6
  • 一、封装【private】 1.概念 广义的封装:函数和类的定义本身,就是封装的体现狭义的封装:一个类的某些属性,...
    hollow_02f9阅读 1,398评论 0 3
  • 最近几天在妈妈家住,侄子侄女甚是欢喜,毕竟他们小时候就比较黏我,我住在这的几天里,侄子侄女每天早起,因为女儿早上醒...
    春暖花会开燕子阅读 533评论 0 2