埃尔法哥哥:Python编程教程:面向对象之高级特性( 六 )
但是这种方式添加的属性和方法, 只在当前对象上有用, 在其他对象上是没用.
class A:
pass
a1 = A()
a1.name = "李四" #给 a1 对象添加一个属性
print(a1.name)
a2 = A()
print(a2.name) # a2中没有 name 属性, 所以抛异常
5.1.2 __slot__ 的基本使用
添加属性和方法最好直接在类中添加, 这样所有的对象都可以拥有了.
如果我想避免把某些属性直接添加到实例对象上, 可以使用一个特殊属性: __slot__ 类实现.
给 __slot__ 定义一个元组, 则元组内的属性名允许在实例对象上直接添加, 其他的都不允许.
class A:
__slots__ = ("name", )
a1 = A()
a1.name = "李四" # 给 a1 对象添加一个属性 name 属性是允许的
print(a1.name)
a1.age = 20 # age 不允许, 所以抛异常
print(a1.age)
注意:
我们的 __init__() 中添加属性是在 self 上添加的, 其实也是直接在对象上添加, 所以没有在元组中的属性名, 也是不允许的.
对于我们直接在类中添加方法是没有任何的影响的.
class A:
__slots__ = ("name",)
def __init__(self):
self.age = 30 # 也是不允许的
a = A()
5.1.3 继承中的 __slot__
__slot__ 只对当前类有用, 对他的子类不起作用. 所以子类也要有自己的 __slot__
class A:
__slots__ = ("name",)
def __init__(self):
self.age = 30 # 也是不允许的
class B:
def __init__(self):
self.age = 30
b = B()
print(b.age)
5.1.4 __slot__ 对性能上的提升
一些人把 __slot__ 作为一种安全的特性来实现, 然后实际上他对内存和执行速度上的性能优化才是最重要的.
不使用 __slot__ , python 使用字典的方式去存储实例数据的, 如果一个程序使用大量的实例, 测内存占用和执行效率都会影响比较大.
使用 __slot__ 后, python 存储实例数据的时候, 不再使用字典, 而是使用一种更加高效的基于数组的数据结构. 可以显著减少内存占用和执行时间.
5.2 实例的测试类型任何一个类都可以做为类型!
创建类的实例时, 该实例的类型是这个类本身, 如果有继承存在, 则父类型也是这个实例的类型.
有些情况下, 我们需要先测试实例的类型然后再写相应的代码.
python 支持 2 种测试方法:
5.2.1 内置函数: type(实例)
class A:
pass
class B(A):
pass
class C:
pass
a = A()
b = B()
c = C()
print(type(a))
print(type(b))
print(type(c))
说明:
type 返回的是这个实例的所属类的类对象.
补充一下:
其实我们经常接触到的有两种对象:1. 实例对象 2. 类对象
类对象就是: 表示类本身的那个对象!
5.2.2 内置函数: isinstance(实例, 类型)
class A:
pass
class B(A):
pass
class C:
pass
a = A()
b = B()
c = C()
print(isinstance(a, A)) # True
print(isinstance(b, B)) # True
print(isinstance(b, A)) # True 继承关系
print(isinstance(c, C)) # True
print(isinstance(c, A)) # False
说明:
这个函数返回的是布尔值, 使用起来方便, 所以以后测试类型建议用这个函数
这个函数继承关系也可以测试出来. b 是 B 类创建出来的, B 继承自 A , 所以 b 也算是类 A的实例.
对一个实例也可以同时测试多个类型, 有一个满足就返回 True , isinstance(实例, (类 a, 类 b, ...))) . 需要把多个类封装到一个 tuple 中.
print(isinstance(c, (A, B, C))) # True
推荐阅读
- 「」儿童节就送阿尔法蛋学习手表,安全贴心又能学习
- -悟空哥哥-618年中大促力来袭,iQOO Neo3应该是你不容错过的5G手机
- 埃尔法哥哥面对用户需求与AI技术之间的不平衡,AI产品经理该如何做?
- 埃尔法哥哥谁说机器学习难?它在这朵云上就没有门槛
- 埃尔法哥哥Python基础语法之“数据应用”
- 埃尔法哥哥Bionumerics软件的多位点VNTR分析
- 埃尔法哥哥一个例子就能读懂大数据,原来数据分析能在这些行业里使用
- 埃尔法哥哥C++程序员的职业生涯规划
- 埃尔法哥哥MAML-Tracker:用目标检测思路做目标跟踪?小样本即可得高准确率丨CVPR 2020
- 埃尔法哥哥数据规范之代码表