目录
一、多态
有了前面的铺垫,我们可以来介绍类的最后一个特点:多态。
多态指一个东西在不同的状态下有不同的属性,比如说,加法和乘法符号作用于数表示四则运算,作用于字符串则表示拼接和复制。通过下面的例子,我们能直观地感受多态的特点。
class Cat:
def __init__(self, name):
self.name = name
class Dog:
def __init__(self, name):
self.name = name
class Fish:
def __init__(self, name):
self.name = name
c = Cat("HuaHua")
d = Dog("DongDong")
f = Fish("YuYu")
def animal(x):
print(x.name)
animal(c)
animal(d)
animal(f)
对于同一个函数,参数不同作用不同,这便是多态一种表现;在类中,每个实例对象都可以有不同的属性也是多态的一种表现。
二、私有变量
顾名思义,外部无法访问的变量,在类中存在,由变量前加两条下横线组成,定义如下:
class A:
def __init__(self, x):
self.__x = x
a = A(12)
print(a.__x)
print(a.__dict__)
# 结果报错,无法访问
但是,Python中没有绝对的私有变量,无法访问只是因为偷天换日了,我们来看一下dict:
class A:
def __init__(self, x):
self.__x = x
a = A(12)
print(a.__dict__)
有意思了,__x其实被改名为了_A__x,我们来尝试一下访问_A__x:
class A:
def __init__(self, x):
self.__x = x
a = A(12)
print(a._A__x)
# 结果为12,访问成功
其实,所谓的私有变量无法访问,本质是偷偷修改了变量名,变为了“_类名__变量名”。
补充:有几条不成文的规矩,变量前加一条下横线表示这个变量不希望被访问,变量后加一条下横线表示这个变量与关键字重名,故加以区分。
三、不可修改的类
字典之所以速度快,是因为其牺牲空间来优化时间,故这种方法会占用资源。Python的灵活性在于其可以动态修改,这就用到了字典。
在类中,__dict__就是一个字典,如果类中的变量是固定的,不会增加,那么就不需要使用字典来动态修改,此时__dict__就造成了资源的浪费。
我们可以使用__slots__方法来固定变量,这时就不会生成__dict__,避免了资源浪费。
class A:
__slots__ = ["x", "y"]
# 指定类A中只有变量x和y
a = A()
a.x = 10
a.y = 10
print(a.x)
print(a.y)
# 结果为10、10
但是我们想给类A增加一个z变量,就会报错:
class A:
__slots__ = ["x", "y"]
# 指定类A中只有变量x和y
a = A()
a.z = 10
print(a.z)
class A:
__slots__ = ["x", "y"]
a = A()
print(a.__dict__)
我们可以看到此时类A并没有创建__dict__。
特别注意:父类的__slots__在子类中并不会生效,子类中可以创建z变量。