美文网首页Python圈Python基础
Python基础 Zero to Hero面向对象编程(二)

Python基础 Zero to Hero面向对象编程(二)

作者: 伊洛的小屋 | 来源:发表于2019-12-11 11:23 被阅读0次

    本文首发自伊洛的个人博客:https://yiluotalk.com,欢迎关注并查看更多内容!!!

    1.私有属性和方法
    • Python 在属性方法名前添加 __两个下划线 __)来拒绝外部的访问
    • 两个下划线是设置私有属性/方法的标准样式, 还有一种设置私有属性/方法的样式,就是在属性/方法名字前加一个下划线_ 但是其实这样的私有属性/方法只仅仅是视为不能直接访问,但是实际上还是可以访问的
    2.类属性,类方法

    类属性类方法是可以直接使用类访问,不需要实例化

    • 类属性
    >>> class Hero(object):
    ...     skill = 'fire'
    ...     def __init__(self, name):
    ...         self._name = name
    ...
    >>> Hero.skill
    'fire'
    >>> xiangyu= Hero('项羽')
    >>> xiangyu.skill
    'fire'
    

    1.创建一个英雄类
    2.英雄的技能是火焰
    3.初始化英雄的名字
    4.实例一个英雄
    5.调用英雄的技能属性

    • 类方法
      类方法用装饰器 @classmethod装饰,类方法中可以访问类属性
      类方法的第一个参数传入的是类对象,而不是实例对象,约定俗成的,类方法中要指代类对象本身都使用 cls
    >>> class Hero(object):
    ...     skill = 'fire'
    ...     def __init__(self, name):
    ...         self._name = name
    ...     @classmethod
    ...     def get_skill(cls):
    ...         return cls.skill
    ...
    >>> Hero.get_skill()
    'fire'
    >>> liubei = Hero('刘备')
    >>> liubei._name
    '刘备'
    >>> liubei.get_skill()
    'fire'
    

    1.不需要实例化就可以调用

    • 静态方法
      静态方法用装饰器 @staticmethod 装饰,和 @classmethod 有点类似。静态方法在运行时不需要实例的参与,并且也不需要传递cls
    #!/usr/bin/python3
    
    class Hero(object):
         skill = 'fire'
         def __init__(self, name):
             self._name = name
         @staticmethod
         def release_skills():
             print(guanyu._name + ' ' +'释放技能' + ': '+ Hero.skill)
    
    guanyu = Hero('关羽')
    Hero.release_skills()
    

    1.静态方法 ,英雄释放技能
    2.不需要实例化直接释放火焰技能

    (yiluo) ➜  Code python test.py
    关羽 释放技能: fire
    
    3.property 装饰器

    @property 装饰器可以将一个方法变成一个属性来使用,通过 @property 装饰器可以获得和修改对象的某一个属性

    @property 表示只读
    @property 和 @.setter 表示可读可写
    @property、@
    .setter、和 @.deleter 表示可读可写可删除
    @property 必须定义在 @
    .setter 的前面
    类必须继承 object 父类,否则 @property 不会生效

    #!/usr/bin/python3
    
    class Hero(object):
         skill = 'fire'
         def __init__(self, name):
             self._name = name
         @property
         def name(self):
             return self._name
         @name.setter
         def name(self, value):
             if isinstance(value, str):
                 self._name = value
             else:
                 raise ValueError
         @name.deleter
         def name(self):
             print('del name')
             del self._name
    
    
    liubei = Hero('刘备')
    print(liubei.name)
    liubei.name = '关羽'
    print(liubei.name)
    liubei.name = 100
    
    (yiluo) ➜  Code python test.py
    刘备
    关羽
    Traceback (most recent call last):
      File "test.py", line 26, in <module>
        liubei.name = 100
      File "test.py", line 15, in name
        raise ValueError
    ValueError
    

    1.这样的好处是可以在方法中对用户传入的数据进行校验(校验了英雄名称是字符串)

    • 删除英雄
    liubei = Hero('刘备')
    print(liubei.name)
    liubei.name = '关羽'
    print(liubei.name)
    del liubei.name
    print(liubei.name)
    
    (yiluo) ➜  Code python test.py
    刘备
    关羽
    删除名字
    Traceback (most recent call last):
      File "test.py", line 27, in <module>
        print(liubei.name)
      File "test.py", line 9, in name
        return self._name
    AttributeError: 'Hero' object has no attribute '_name'
    

    1.英雄已经被成功删除

    ......待续

    享受每一天,Just Enjoy !

    关注公众号获取更多内容

    相关文章

      网友评论

        本文标题:Python基础 Zero to Hero面向对象编程(二)

        本文链接:https://www.haomeiwen.com/subject/spnngctx.html