天天看点

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

Python基础 Zero to Hero面向对象编程(二)
本文首发于伊洛的个人博客: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
           
Python基础 Zero to Hero面向对象编程(二)
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.英雄已经被成功删除
…待续
Python基础 Zero to Hero面向对象编程(二)
Python基础 Zero to Hero面向对象编程(二)
享受每一天,Just Enjoy !
Python基础 Zero to Hero面向对象编程(二)

继续阅读