本文首发自伊洛的个人博客: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 !
网友评论