前言
断更两个多月了,一直在忙学校的事情,疫情下压缩课时,每天都有很多事情要处理,现在终于放假了,继续
开始更新这两个月内的学习收获,这两个月在python和java的基础方面进行了很多实践,这篇来记录一下python的面向对象编程收获,都是一些基础知识。
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
28class Entity:
""" """
_id = "Entity" #_id表示保护变量,只能允许其本身与子类进行访问,不能用于 from module import * ,__id表示私有变量,只能允许这个类本身进行访问。
def __init__(self): #__init__是python中的特殊函数之一,作为构造函数。
"""
Something the player can interact with
"""
self._collidable = True #与Java中不太相同的是,python的类变量不需要全部声明在类中。
def get_id(self):
""" """
return self._id
def set_collide(self, collidable):
""" """
self._collidable = collidable
def can_collide(self):
""" """
return self._collidable
def __str__(self): #__str__和__repr__也是特殊函数,用于将值或者说类转化为字符串形式,但有区分,此处不细说。
return f"{self.__class__.__name__}()"
def __repr__(self):
return str(self)
需要说明的是,在python中不引入模块的话是无法创建抽象类的,但我可以将Entity类当作抽象类来使用。
如果需要构建抽象类,下面是抽象类的示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import abc #利用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta):
all_type='file'
#定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass
#定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
下面继续说回刚刚我定义的实体类Entity,如下有几个类对其进行了继承:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Wall(Entity):
""" """
_id = WALL
def __init__(self):
""" """
super().__init__()
self.set_collide(False)
class Item(Entity):
""" """
def on_hit(self, game):
""" """
raise NotImplementedError
WALL是一个可以使用的类,而Item则是另一个抽象基类。这里raise用于抛出异常 类似java中throw。而调用父类方法需要用super().xxx
而Item是我需要用来创建各种游戏中角色的基类(这个项目是一个tkinter的游戏),如下是他的其中一个子类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class MoveIncrease(Item):
""" """
_id = MOVE_INCREASE
def __init__(self, moves=5):
""" """
super().__init__()
self._moves = moves
def on_hit(self, game):
""" """
player = game.get_player()
player.change_move_count(self._moves)
game.get_game_information().pop(player.get_position())
为子类创建实例 —>> m=MoveIncrease()
调用实例函数 —>> m.on_hit(game)
调用实例变量 —>> m.id 当然调用的方式有很多比如getattr()之类,就不一一列举了。
python中的类还有一些内置属性:
“dict“ : 类的属性(包含一个字典,由类的数据属性组成)
“doc“ :类的文档字符串
“name“: 类名
“module“: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
“bases“ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
关于重写方法,只要在子类中使用与父类中相同函数名就可以了。
后记
这只是面向对象最基础的部分,还有许多如运算符重载,垃圾回收等等没有写入进去,留待日后有心得再补充。