Python 类之类的成员
对于一个学 C++ 的朋友来说, Python 类中, 哪些是私有成员, 哪些是共有成员, 估计一直傻傻分不清.
一, 本篇博客要解决的问题:
Python 类中, 哪些是私有成员? 哪些是共有成员?
二, 关于 Python 的类
要想了解 Python 的类, 就必须认识到, 当你在 Python 中写了一个类的时候, 你就已经构建了一个新的类型.
所以, 你写的类型其本身有属性和方法, 而类型对应的实例, 也有自己的属性, 不过并没有方法.
也就是说, Python 中的类, 实际上有两层含义, 第一层是类本身, 第二层是实例.
类型本身有属性和方法, 类的属性可以在所有实例中传递, 类的方法用来处理实例的数据.
实例本身只有属性, 没有方法, 属性就是要被类的方法所处理的数据.
Python 通过 class 语句定义一个类, 通过__init__(self, *para) 构造一个实例, 并通过__del__(self) 来解构. class 是类, self 是实例.
三, 解决问题.
了解了上面所说的类和实例之后, 你可能就已经明白了. Python 中类的属性其实就是共有变量, 我们称之为类的变量, 类的变量可以在所有实例中间传递. 而实例的属性则可以大致看成是私有变量, 但其实这并不是严格意义上的私有变量, 因为我们依然可以通过 instance.property 来访问并修改这些属性. 综上所述: Python 中, 类的成员, 有两种.
1, 类成员. 可以通过 Class.property 来调用, 也可以通过 instance.property 来调用, 该属性可以在所有实例中传递
2, 实例的成员. 只能通过 instance.property 来调用, 该属性不与其他实例共享.
3, 注意, 类的 self 相当于 C++ 中的指针, 但是也有所不同, 因为 self 只指示该实例的数据, 不指示类的属性和方法. 所以当你需要在类的方法中调用类的属性或者类的其他方法的时候, 你需要用类名或者 self 来指明. 但是用类名和用 self 来指明时, 结果是不一样的. 详情请见四中的实例代码.
四, 示例代码
# -*- coding: utf-8 -*- # author: zxr # time: 2019-04-10 # functionality: test class class TestClass: val = 0 def __init__(self, v): self.val1 = v def show(self): print ('-'*60) print (self.val1) def add_using_classname(self): self.val1 += TestClass.val TestClass.show(self) # below code is unvalid # self.val1 += val # show() def add_using_self(self): self.val1 += self.val self.show() if __name__ == '__main__': tc = TestClass(1) tp = TestClass(10) print (TestClass.val) print (tc.val) print (tc.val1) print (TestClass.val) print (tp.val) print (tp.val1) print ('-'*60) TestClass.val = 2 print ('-'*60) print (TestClass.val) print (tc.val) print (tc.val1) print (TestClass.val) print (tp.val) print (tp.val1) print ('-'*60) tp.val1 = 3 tc.val1 = 4 tp.val = 30 tc.val = 40 print ('-'*60) print (TestClass.val) print (tp.val) print (tc.val) print (tp.val1) print (tc.val1) tc.add_using_classname() tp.add_using_classname() tc.add_using_self() tp.add_using_self() test class
总结: Python 中的类与 C++ 中的类是不一样的. Python 中的每实例化一个实例之后, 就拷贝了一个该类的副本, 对这个实例的任何修改都不会影响到类. 同样的, 要想修改类中的属性, 也只能在类中修改, 在实例中的修改影响不了其他实例.
来源: https://www.2cto.com/kf/201904/801350.html