一、方法
名称 | 声明 | 特点 | 调用 |
---|---|---|---|
对象方法 | 直接声明 | 自带self参数,指向当前对象 | 对象.方法() |
类方法 | 加@classmethod | 自带cls参数,指向当前类 | 类.方法() |
静态方法 | 加@staticmethod | 没有默认参数 | 类.方法() |
使用:
需要对象属性,声明对象方法;
若不需,则看需要类字段,声明类方法;
都不需,则声明静态方法
二、构造方法和__ init __方法
python中声明类的时候系统会自动创建这个类对应的构造方法,构造方法内会调用__ init __方法,用来对对象进行初始化, __ init __方法调用结束后,返回对象
def 与类名相同的构造方法(*args, **kwargs):
对象 = 创建对象
对象.__init__(*args, **kwargs)
return 对象
def __init__(self):
方法内容
-
对象属性
self.属性名 = 值 -
类的字段
字段名 = 值
class Person:
# num就是类的字段
num = 6
# __slots__ = ('name', 'age')
# 在init方法中声明对象属性
def __init__(self, name, age):
self.name = name
self.age = age
注:(__ slots __魔法):约束当前类的对象最多能拥有几个属性,且会使对象的 __ dict __属性失效
三、对象属性的 增删查改
I. 增
对象.属性 = 值 | 添加属性(属性不存在时) |
---|---|
setattr(对象, 属性名, 值) | 添加属性(属性不存在时,属性名为str) |
II. 删
del 对象.属性 | 删除属性 |
---|---|
delattr(对象, 属性名) | 删除属性(属性名为str) |
III. 查
对象.属性 | 获取对象指定属性值(属性必须存在) |
---|---|
getattr(对象, 属性名, 默认值) | 获取对象指定属性值(属性不存存在,返回默认值,且默认值必须赋值,属性名为str) |
IV. 改
对象.属性 = 值 | 修改属性(属性存在时) |
---|---|
setattr(对象, 属性名, 值) | 修改属性(属性存在时,属性名为str) |
四、内置属性
编号 | 表达式 | 功能 | 返回类型 |
---|---|---|---|
1 | 对象.__ class __ | 获取对象对应的类 | 类 |
2 | 类.__ name __ | 获取类的名字 | 字符串 |
3 | 类.__ doc __ | 获取类的说明文档 | 字符串 |
4 | 对象.__ dict __ | 将对象转换成字典(属性:值) | 字典 |
5 | 类.__ module __ | 获取当前类所在的模块的模块名 | 字符串 |
6 | 类.__ bases __ | 获取当前类的父类 | 元祖 |
- 定制对象打印格式
def __repr__(self):
# return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
# 结果:<__main__.Person object at 0x29c310>
return '<' + str(self.__dict__)[1:-1] + ' at ' + hex(id(self)) + '>'
五、私有化
python中在属性或者方法名前加 __ ,就可以将属性或者方法变成私有的
(注意:只能两 __ 开头,不能 __ 结尾)
私有的属性和方法只能在类的内部使用,不能在类的外面使用
原理:
在名字前是 __ 的属性和方法前再加 ' _ 类名 ' 去保存属性和方法
六、getter/setter
I. getter
第一步:声明属性的时候在属性名前加 _
第二步:声明函数(函数没有除了self以外的参数,但是要有返回值。返回值就是获取属性拿到的值)
第三步:在类的外部通过对象.去掉 _ 的属性去获取相关的属性
格式:
@property
def 去掉_的属性名(self):
做点别的事情
返回属性的值
class Person:
def __init__(self):
self._week = 7 # 属性名前有_,使用属性的时候不要直接用
@property
def week(self):
if self._week < 7:
return '星期%d' % self._week
else:
return '星期天'
p1 = Person()
# 通过不带_的属性来获取属性的值实质是在调用getter对应的函数
print(p1.week)
II. setter
(注:想要添加setter必须先要有getter)
第一步:声明属性的时候在属性名前加_
第二步:声明函数(函数除了self以外还需要一个参数,没有返回值。这儿的参数代表给属性赋的值)
第三步:在类的外部通过对象.去掉_的属性去给相关属性赋值
格式:
@属性名去掉 _ .setter
def 去掉 _ 的属性名(self, 参数):
做点别的事情
给属性赋值
class Person:
def __init__(self):
self._age = 0
@property
def age(self):
return self._age
# 给age添加setter
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError
if not (0 <= value <= 150):
raise ValueError
self._age = value
p1 = Person()
# 通过不带_的属性给属性赋值实质是在调用setter对应的函数
p1.age = 45
print(p1.age)
网友评论