python面向对象中的封装、构造和析构方法

⾯向对象三⼤特征:封装、继承、多态。

1.封装

封装是指隐藏对象的属性和实现细节,仅对外公开接⼝,控制在程序中属性的读取和修改的访问级别。

类本身就是⼀种封装,通过类可以将数据(属性)和⾏为(⽅法)相结合,形成⼀个有机的整体,也就是将数据与对数据的操作有机的结合。封装的⽬的是增强安全性和简化编程,使⽤者不必了解具体的实现细节,⽽只是要通过外部接⼝,以特定的访问权限来使⽤类的成员。成员私有化是实现封装的⼿段。所有的成员默认是公有。

1.1.属性私有化

如果想让类的内部属性不被外界直接访问,可以在这个属性的前⾯加两个下划线__,在Python中,如果⼀个属性的前⾯出现 __,就表示这个属性只能在当前类的⽅法中被直接访问,不能通过对象直接访问,这个变量就被称为私有变量。例如,

class PlayGame:
    def __init__(self, gamename, gametype, gamescore, player):
        self.gamename = gamename
        self.gametype = gametype
        self.gamescore = gamescore
        self.__player = player  # player为私有属性

    def play(self):
        print("game start")
        self.comment()

    def comment(self):
        print("good game")

我们在类外无法直接获取和修改player属性的值,例如,

dmc5 = PlayGame("Devil May Cry5", "act", 10, "Forseti")
print(dmc5.player)

执行结果如下,

AttributeError: type object 'PlayGame' has no attribute 'player'

我们可以通过__dict__来查看类内的值,例如,

print(dmc5.__dict__)

执行结果如下,

{'gamename': 'Devil May Cry5', 'gametype': 'act', 'gamescore': 10, '_PlayGame__player': 'Forseti'}

我们可以看到实际上python将私有属性的名称进行了改变,使得我们无法以私有属性名来访问,改变后的属性名为:_类名__私有属性名。我们可以通过改变后的属性名来查看该属性值。例如,

print(dmc5._PlayGame__player)

执行结果如下,

Forseti

我们也可以在类内定义公有方法来获取和修改私有属性值,例如

class PlayGame:
    def __init__(self, gamename, gametype, gamescore, player):
        self.gamename = gamename
        self.gametype = gametype
        self.gamescore = gamescore
        self.__player = player

    def play(self):
        print("game start")
        self.comment()

    def comment(self):
        print("good game")

    def get_player(self):  # 获取私有属性值
        return self.__player

    def set_player(self, player):  # 修改私有属性值
        self.__player = player


print(dmc5.get_player())
dmc5.set_player("King")
print(dmc5.get_player())

执行结果如下,

Forseti
King

1.2.属性装饰器

对于私有属性的访问,使⽤公开⽅法间接访问的⽅法太麻烦, python提供了⼀种便捷语法,属性装饰器,通过属性装饰器,可以很⽅便的对私有属性进访问,属性修饰器可以把⽅法属性化。

例如,

class PlayGame:
    def __init__(self, gamename, gametype, gamescore, player):
        self.gamename = gamename
        self.gametype = gametype
        self.gamescore = gamescore
        self.__player = player

    def play(self):
        print("game start")
        self.comment()

    def comment(self):
        print("good game")

    @property  # 属性装饰器,将player属性变成了一个可读属性
    def player(self):
        return self.__player

    @player.setter  #可写属性,语法结构:@可读属性名.setter,必须先可读
    def player(self, player):
        self.__player = player


print(dmc5.player)
dmc5.player = "King"
print(dmc5.player)

执行结果如下,

Forseti
King

1.3.成员方法私有化

如果对⼀个⽅法的名字前⾯加__,声明该⽅法为私有⽅法,只能在当前类中被调⽤,在外界不能通过对象直接调⽤,这就是私有⽅法。

2.构造和析构

2.1.构造方法

构造方法的⽬的是构造⽅法⽤于初始化对象(不创建对象),可以在构造⽅法中添加成员属性。系统会在实例化对象时自动调用构造方法。析构方法的第⼀个参数必须是self,其它参数根据需要⾃⼰定义,且不应该返回任何其他值。例如,

class PlayGame:
    def __init__(self, gamename, gametype, gamescore, player):
        self.gamename = gamename
        self.gametype = gametype
        self.gamescore = gamescore
        self.__player = player

这就是一个构造方法。

注意,如果没有定义构造⽅法,系统会⽣成⼀个⽆参构造⽅法,如果⾃⼰定义了构造⽅法,则系统不会⾃动⽣成。⼀个类只能有⼀个构造⽅法,如果定义多个,后⾯的会覆盖前⾯的。构造函数由系统在实例化对象时⾃动调⽤,不要⾃⼰调⽤。

2.2.析构方法

析构方法的⽬的是对象销毁时,释放资源。其会在对象销毁时由系统⾃动调⽤,除了self外,没有其他参数,切无返回值。语法为,

def __del__(self):
	# 执行体

2.3.__str__方法

__str__方法可以将对象转化为字符串,当对对象调用print()或str()的时候自动调用,参数为self,返回值为字符串。例如,

class PlayGame:
    def __init__(self, gamename, gametype, gamescore, player):
        self.gamename = gamename
        self.gametype = gametype
        self.gamescore = gamescore
        self.__player = player

    def __str__(self):
        return "游戏测评"


print(dmc5)

执行结果如下,

游戏测评

你可能感兴趣的:(python面向对象中的封装、构造和析构方法)