... self.__z = value
...
>>> b = MyClass( 2, 4, 8)
如下 , 我们利用相应的属性.z来访问和修改数据属性.__ z:
>>> b.z
8
>>> b.z = 16
>>> vars(b)
{ 'x': 2, '_y': 4, '_MyClass__z': 16}
这段代码比上述示例更精简优雅 。
文章插图
类与静态方法
除了实例方法和属性之外 , 类还可以拥有类方法和静态方法 。
下面让我们为MyClass添加三个方法:
>>> classMyClass:
... def__init__(self, arg_1, arg_2, arg_3):
... self.x, self._y, self.__z = arg_1, arg_2, arg_3
...
... deff(self, arg):
... print( 'instance method f called')
... print( f'instance: {self}' )
... print( f'instance attributes:n {vars(self)}' )
... print( f'class: {type(self)}' )
... print( f'arg: {arg}' )
...
... @classmethod
... defg(cls, arg):
... print( 'class method g called')
... print( f'cls: {cls}' )
... print( f'arg: {arg}' )
...
... @staticmethod
... defh(arg):
... print( 'static method h called')
... print( f'arg: {arg}' )
...
>>> c = MyClass( 2, 4, 8)
方法.f是一个实例方法 。实例方法的第一个参数是对象本身的引用 。这些方法可以利用self访问对象 , 利用vars(self)或self.__dict__访问对象的数据属性 , 还可以利用type(self)或self.__class__访问对象对应的类 , 而且它们还可以拥有自己的参数 。
方法.g的开头包含修饰器@classmethod , 表明这是一个类方法 。每个类方法的第一个参数都会指向类本身 , 按照约定该参数名为cls 。与实例方法的情况一样 , 我们不需要明确提供与cls对应的参数 。而类方法可以利用cls和自己的参数访问类本身 。
方法.h的开头包含修饰器@staticmethod , 表明这是一个静态方法 。静态方法只能访问自己的参数 。
Python中常见的调用实例方法的方法如下:
>>> c.f( 'my-argument')
instance method f called
instance:<__main_ _.MyClass object at 0x7f32ef3def98>
instance attributes:
{ 'x': 2, '_y': 4, '_MyClass__z': 8}
class: <class ' __main__. MyClass'>
arg:my-argument
通常 , 我们应该直接通过类(而不是实例)调用类方法和静态方法:
>>> MyClass.g( 'my-argument')
classmethodgcalled
cls:< class' __main__. MyClass'>
arg:my-argument
>>> MyClass.h( 'my-argument')
static method h called
arg:my-argument
请记住 , 我们不需要传递类方法的第一个参数:与cls相对应的参数 。
但是 , 我们可以像下面这样调用类方法和静态方法:
>>> c.g( 'my-argument')
classmethodgcalled
cls:< class' __main__. MyClass'>
arg:my-argument
>>> c.h( 'my-argument')
static method h called
arg:my-argument
当我们调用c.g或c.h , 但实例成员没有这样的名称时 , Python会搜索类和静态成员 。
文章插图
继承
继承是面向对象编程的另一个重要特性 。在这个概念中 , 类(称为子类或派生类)会继承其他类(称为超类或基类)的数据和函数成员 。
在Python中 , 所有类都会默认继承Python自带的类对象 。但是 , 我们可以根据需要定义合适的类继承层次结构 。
例如 , 我们可以创建一个名为MyOtherClass的新类 , 该类继承了MyClass:
>>> classMyOtherClass(MyClass):
... def__init__(self, u, v, w, x, y, z):
... super.__init__(x, y, z)
... self.__u, self.__v, self.__w = u, v, w
...
... deff_(self, arg):
... print( 'instance method f_ called')
... print( f'instance: {self}' )
... print( f'instance attributes:n {vars(self)}' )
... print( f'class: {type(self)}' )
推荐阅读
- 如何使用 Python 完成 Git 管理?
- 如何让蜘蛛有效的爬行你的网站?
- 2019 年度 Python 类库 Top 10
- 用Python远程登陆服务器的最佳实践
- python+C、C++混合编程的应用
- 让腾讯大佬告诉你,写python到底用什么IDE合适
- 12道常见Python面试题,你能答对几个?
- 淘宝直播和商家合作佣金一般怎么算? 淘宝主播申请佣金链接该如何同意
- 如何实现一个简单的RPC
- 多合一小程序:小程序如何解决“用完即走,再也不来”