Python是一种面向对象的编程语言,其核心思想是将数据和处理数据的方法封装在一起。在Python中,一切都是对象,包括数字、字符串、函数以及类本身。类是对象的蓝图,定义了对象的属性和行为。Python类的功能非常丰富,它们利用多态和继承来实现复杂的功能。
Python语言的一个特点是它不会过度复杂化某些概念,封装就是其中之一。在Python中,封装主要通过命名约定来实现。程序员需要熟悉这些约定,并遵守它们。
为了表示一个类变量或方法仅供内部使用,可以在名称前添加一个下划线(_)。同样的原则也适用于模块级别的函数,例如sys._getframe()
。内部变量、方法等通常仅供“内部”使用,外部使用通常是不推荐的,因为它们的变化不会反映在库文档中,使用它们可能会导致代码变得脆弱。
class Cells:
def __init__(self):
self._internal = 0 # 内部变量
def public_method(self):
"""一个公共方法"""
pass
def _internal_method(self):
pass
内部对象(实例属性、方法等)通常用作实现特定目标的手段,以在公共方法中实现特定的目标。
Python使用前导双下划线(__)来私有化类变量或方法。多态是子类覆盖父类属性的能力,这通常是必要的,因为父类方法可能不完全符合子类的需求。通过在子类中重新定义方法来实现多态。
class Cell:
def __init__(self):
self.__id = 0
def __private_method(self):
pass
def public_method(self):
self.__private_method()
与前面提到的单下划线(_)不同,使用双下划线(__)实际上会导致Python执行名为名称改写的操作。
class AnimalCell(Cell):
def __init__(self):
super().__init__()
self.__id = 1 # 不会覆盖Cell类中的self.__id
def __private_method(self):
"""不会覆盖Cell类中的__private_method"""
pass
名称改写确保名称不会冲突,通过足够的修改来防止冲突或覆盖。
元编程是所有计算中广泛使用的范式之一,每种语言都以自己的方式实现它。元编程的核心是创建函数和类,其主要目标是操作代码。
class Analytics:
def __init__(self, site):
self.site = site
Analytics("www.analyticsvidhya.com")
在创建类实例时,类的__init__
方法用于创建类的实例。在__init__
之前,有一个名为__new__
的方法会被调用,它负责创建类,而__init__
负责实例化该类。
类和其他所有Python对象一样,也是基于某种构造器或模板创建的,这些模板/构造器就是所说的元类。Python实际上是通过调用元类来创建新类的。
class MyMeta(type):
def __new__(cls, clsname, bases, clsdict, **kwargs):
for name, value in clsdict.items():
print(name, value)
return type.__new__(cls, clsname, bases, clsdict)
class myClass(meta=MyMeta):
def __init__(self):
pass
元类继承自type对象,这使它们能够比默认的Python类低一个级别。定义元类时,需要定义四个位置参数(必需的),也可以提供可选参数。
通过将类的元设置为自定义元类,可以确保类按照元类中指定的方式创建。如果决定在创建元类时使用可选或关键字参数,也可以通过类将它们传递给元类。
def __init__(self, name, shares, price):
self.name = name
self.shares = shares
self.price = price
def cost(self):
return self.shares * self.price
cls_dict = {
'__init__': __init__,
'cost': cost,
}
# 创建类
import types
Stock = types.new_class('Stock', (), {}, lambda ns: ns.update(cls_dict))
Stock.__module__ = __name__