# 四、类的方法 # ## 1、类专有的方法 ## 一个类创建的时候,就会包含一些方法,主要有以下方法: 类的专有方法: | 方法 | 说明 | | ------| ------ | |`__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) ``` 运行的结果: ![Python 方法的装饰器](https://user-gold-cdn.xitu.io/2017/7/29/94ae6aec01a94136951cbb8314008781)