贡献者: addis
一个例子
# 定义 person 类
class person(): # 括号可以省略
def __init__(self, name, age): # 构造函数(只能有一个)
self.name = name
self.age = age
def show(self):
print("name is", self.name)
print("age is", self.age)
# 生成对象
p1 = person("jason", "30")
p2 = person("justin", "28")
# 调用成员函数
p1.show();
p2.show();
运行结果
name is jason
age is 30
name is justin
age is 28
另一个例子:来定义一个平面点类
class point:
"""这里是 point.__doc__ 的内容"""
def __init__(self, x, y):
self.x = x
self.y = y
# 用于 print()
def __str__(self):
return "({0}, {1})".format(self.x, self.y)
# 用于不加分号自动显示(一般是构造该对象的命令), 也可以用 repr(obj) 直接调用
def __repr__(self):
return "point({0}, {1})".format(self.x, self.y)
def __add__(self, other): # 算符 +, self 必须是第一个变量
if isinstance(other, point):
return point(self.x + other.x, self.y + other.y)
else:
return point(self.x + other, self.y + other)
# 调用可以直接用 p.len, 省略括号, 只读
@property
def len(self):
return self.x**2 + self.y**2
dir(类名) 或者 dir(obj) 查看其所有性质(attributes)
vars(obj) 查看对象的所有数据成员,等效地也可以用 teddy.__dict__
obj.__module__ 查看对象所在的模块,如果不在模块中定义的,就返回 '__main__'。如果是内建类型,就返回 'builtins'
import inspect 模块可以检查 python 对象的方方面面,各种性质。具体见 dir(inspect)。
__add__(+),__sub__(-),__mul__(*),__truediv__(/),__floordiv__(//),__mod__(%),__lshift__(<<),__rshift__(>>),__and__(&),__or__(|),__xor__(^),__invert__(~),__lt__(<),__le__(<=),__eq__(==),__ne__(!=),__gt__(>),__ge__(>=),__getitem__(self, i)(对象[i]),__setitem__(self, i, val)(对象[i] = 值),__iter__(self)(迭代器 iter()),__next__(self)(迭代器 next())
__radd__(self, other) 可以定义 other + self(当 other 具有不同类型时会被调用)。
x[start:end:step] 中,start:end:step 等效于 slice(start, end, step),类型是 slice. 如果三个中哪个被省略了,哪个就是 None。注意 start:end:step 不能单独使用。
getattr() 函数可以获取对象成员
delattr() 删除成员
hasattr() 检查是否存在成员
setattr() 改变成员
class 类名(基类名): 定义派生类,类名.__base__ 查看基类。最底层的基类都是 object