2017-07-30 16:44:51 +00:00
|
|
|
|
# 四、类的方法 #
|
|
|
|
|
|
|
|
|
|
## 1、类专有的方法 ##
|
|
|
|
|
|
|
|
|
|
一个类创建的时候,就会包含一些方法,主要有以下方法:
|
|
|
|
|
|
|
|
|
|
类的专有方法:
|
|
|
|
|
|
2017-12-22 08:14:43 +00:00
|
|
|
|
| 方法 | 说明 |
|
|
|
|
|
| ------| ------ |
|
2017-07-30 16:44:51 +00:00
|
|
|
|
|`__init__` |构造函数,在生成对象时调用|
|
|
|
|
|
|`__del__ `| 析构函数,释放对象时使用|
|
|
|
|
|
|`__repr__ `| 打印,转换|
|
|
|
|
|
|`__setitem__ `| 按照索引赋值|
|
|
|
|
|
|`__getitem__`| 按照索引获取值|
|
|
|
|
|
|`__len__`| 获得长度|
|
|
|
|
|
|`__cmp__`| 比较运算|
|
|
|
|
|
|`__call__`| 函数调用|
|
|
|
|
|
|`__add__`| 加运算|
|
|
|
|
|
|`__sub__`| 减运算|
|
|
|
|
|
|`__mul__`|乘运算|
|
|
|
|
|
|`__div__`| 除运算|
|
|
|
|
|
|`__mod__`| 求余运算|
|
|
|
|
|
|`__pow__`|乘方|
|
|
|
|
|
|
|
|
|
|
当然有些时候我们需要获取类的相关信息,我们可以使用如下的方法:
|
|
|
|
|
|
|
|
|
|
* `type(obj)`:来获取对象的相应类型;
|
|
|
|
|
* `isinstance(obj, type)`:判断对象是否为指定的 type 类型的实例;
|
|
|
|
|
* `hasattr(obj, attr)`:判断对象是否具有指定属性/方法;
|
|
|
|
|
* `getattr(obj, attr[, default])` 获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;
|
|
|
|
|
* `setattr(obj, attr, value)`:设定该属性/方法的值,类似于 obj.attr=value;
|
|
|
|
|
* `dir(obj)`:可以获取相应对象的所有属性和方法名的列表:
|
|
|
|
|
|
|
|
|
|
## 2、方法的访问控制 ##
|
|
|
|
|
|
|
|
|
|
其实我们也可以把方法看成是类的属性的,那么方法的访问控制也是跟属性是一样的,也是没有实质上的私有方法。一切都是靠程序员自觉遵守 Python 的编程规范。
|
|
|
|
|
|
|
|
|
|
示例如下,具体规则也是跟属性一样的,
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
|
|
class User(object):
|
|
|
|
|
def upgrade(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def _buy_equipment(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def __pk(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3、方法的装饰器 ##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* **@classmethod**
|
|
|
|
|
调用的时候直接使用类名类调用,而不是某个对象
|
|
|
|
|
|
|
|
|
|
* **@property**
|
|
|
|
|
可以像访问属性一样调用方法
|
|
|
|
|
|
|
|
|
|
具体的使用看下实例:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
|
|
class UserInfo(object):
|
|
|
|
|
lv = 5
|
|
|
|
|
|
|
|
|
|
def __init__(self, name, age, account):
|
|
|
|
|
self.name = name
|
|
|
|
|
self._age = age
|
|
|
|
|
self.__account = account
|
|
|
|
|
|
|
|
|
|
def get_account(self):
|
|
|
|
|
return self.__account
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def get_name(cls):
|
|
|
|
|
return cls.lv
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def get_age(self):
|
|
|
|
|
return self._age
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
userInfo = UserInfo('两点水', 23, 347073565);
|
|
|
|
|
# 打印所有属性
|
|
|
|
|
print(dir(userInfo))
|
|
|
|
|
# 打印构造函数中的属性
|
|
|
|
|
print(userInfo.__dict__)
|
|
|
|
|
# 直接使用类名类调用,而不是某个对象
|
|
|
|
|
print(UserInfo.lv)
|
|
|
|
|
# 像访问属性一样调用方法(注意看get_age是没有括号的)
|
|
|
|
|
print(userInfo.get_age)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
运行的结果:
|
|
|
|
|
|
2017-12-22 08:14:43 +00:00
|
|
|
|

|