Skip to content

Latest commit

History

History
106 lines (77 loc) · 2.89 KB

File metadata and controls

106 lines (77 loc) · 2.89 KB

四、类的方法

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 的编程规范。

示例如下,具体规则也是跟属性一样的,

#!/usr/bin/env python# -*- coding: UTF-8 -*-classUser(object):
defupgrade(self):
passdef_buy_equipment(self):
passdef__pk(self):
pass

3、方法的装饰器

  • @classmethod 调用的时候直接使用类名类调用,而不是某个对象

  • @property 可以像访问属性一样调用方法

具体的使用看下实例:

#!/usr/bin/env python# -*- coding: UTF-8 -*-classUserInfo(object):
lv=5def__init__(self, name, age, account):
self.name=nameself._age=ageself.__account=accountdefget_account(self):
returnself.__account@classmethoddefget_name(cls):
returncls.lv@propertydefget_age(self):
returnself._ageif__name__=='__main__':
userInfo=UserInfo('两点水', 23, 347073565);
# 打印所有属性print(dir(userInfo))
# 打印构造函数中的属性print(userInfo.__dict__)
# 直接使用类名类调用,而不是某个对象print(UserInfo.lv)
# 像访问属性一样调用方法(注意看get_age是没有括号的)print(userInfo.get_age)

运行的结果:

Python 方法的装饰器