人工智能学习 6 - Python对象和类

类的定义和使用

类定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class SuperClass():
# 属性/变量, 不定义直接在 __init__ 中赋值即可完成属性的声明
# name = ""

# 构造函数
def __init__(self, name=""):
# 公有属性
self.name = name
# 私有属性
self._ctime = time.time()

# 方法/函数
def debug(self, *args, **kvargv):
print(self.name, args, kvargv)

# 标记为私有方法, 但仍可调用, 可以继承, 可以重写 (就只是个标记, 没有任何强制约束)
def _internal_method(self):
pass

# 标记为私有方法, 无法直接调用(使用 _ClassName__FuncName 方法调用), 无法继承, 可以重写
def __internal_method(self):
pass

# 继承: 子类可以使用父类的一些方法
# 封装: 私有(内部)的属性和方法的隐藏:
# 使用 `_` 前缀标记私有, 虽然依然可以直接调用.
# 使用 `__` 前缀标记私有, 无法直接调用, 但是可以使用 `obj._ClassName__FuncName()`; 在子类中隐藏, 无法直接调用和覆盖.
class ClassName(SuperClass):
# 构造函数的调用
def __init__(self, name="name", age=18):
super().__init__(name)
self.age = age

# 父类方法调用/重写
def debug(self, *args, **kvargv):
super().debug(*args, **kvargv)
print("111")

初始化对象

1
2
cn = ClassName(name="zs", age=22)
cn.debug()

类的 setter 和 getter

可管理属性(装饰器): 保留了属性可见性, 增加了 getter 和 setter 的逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ClassName():
def __init__(self, name, age):
self.__name = name
self.__age = age

@property
def age(self):
if self.__age > 100:
return 100

return self.__age

@age.setter
def age(self, age):
if 0 < age <= 100:
self.__age = age
else
print("invalid age", age)

类的魔法方法

  • __new__ 创建对象, __init__ 将创建后的对象初始化
  • __eq__ == , __ne__ != , __ge__ >= , __gt__ > , __le__ <= , __lt__ < , __contains__ in
  • __add__ +-, __mul__ */, __mod__ %, __rmod__ %, __rmul__ /
  • __len__, __sizeof__, __hash__, __str__, __repr__, __format__,
  • __setattr__, __getitem__, __getattribute__, __delattr__,

__class__, __doc__,
__getnewargs__, __getslice__,
__reduce__, __reduce_ex__,
__subclasshook__,

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.