Python 类

Class对象

类对象支持两种操作:属性引用和实例化。

实例对象

实例对象有两种有效的属性名称:数据属性和方法。

  • 数据属性,不需要声明,像局部变量一样,将在第一次被赋值时产生
  • 方法是 “从属于” 对象的函数

方法对象

方法的特殊之处在于实例对象会作为函数的第一个参数被传入。

\(x.f() \Leftrightarrow MyClass.f(x)\)

类变量和实例变量

  • 类变量,类的所有实例共享的属性和方法。
  • 实例变量,每个实例的唯一数据。

补充说明

  • 如果同样的属性名称同时出现在实例变量和类变量中,属性查找会优先选择实例变量。
  • 在 Python 中没有任何东西能够强制隐藏数据,它是完全基于约定的。
  • 每个值都是一个对象,因此具有类型,并存储为 object.__class__。
class MyClass:
    """A simple example class"""
    num = 12345    # 类变量
    
    def __init__(self):
        # 定义类初始化方法
        self.data = []    # 实例变量
    
    def f(self):
        return "hello world."

# 属性引用
MyClass.num
MyClass.__doc__    # 返回类的文档字符串 "A simple example class"
# 类实例化
x = MyClass()

# 函数对象
MyClass.f

# x.f为方法对象
# x.f(),方法绑定后立即被调用,相当于 MyClass.f(x)
# xf = x.f,将方法保存起来再调用
x.f()
xf = x.f
print(xf())

# 相同名称的类变量和实例变量,优先实例变量
class Warehouse:
    purpose = 'storage'
    region = 'west'
w = Warehouse()
w.region = 'east'
print(w.purpose, w.region)    # 输出 storage east

继承

  • BaseClassName 必须定义于包含派生类定义的作用域中
  • Python 中所有方法实际上都是 virtual 方法
  • 使用 isinstance() 方法检查一个实例的类型
  • 使用 issubclass() 方法检查类的继承关系

多重继承

class DerivedClassName(BaseClassName):
    <statement-1>
    ...
    ...
    <statement-N>


class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    ...
    ...
    <statement-N>

私有变量

仅限一个对象内部访问的私有实例变量在 Python 中并不存在,但是大多数 Python 代码都遵循这样一个约定:带有一个下划线的名称 (如_spam) 应当被当作是 API 的非公有部分 (无论是函数、方法或是数据成员)。

class Mapping:
    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # private copy of original update() method

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # provides new signature for update()
        # but does not break __init__()
        for item in zip(keys, values):
            self.items_list.append(item)

迭代器

for() 语句会在容器对象上调用 iter() 方法,该函数返回一个定义了 __next()__ 方法的迭代器对象,此方法将逐一访问容器中的元素。当元素用尽时,__next__() 将引发 StopIteration 异常类终止 for 循环。

>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x10c90e650>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    next(it)
StopIteration


class Reverse:
    """Iterator for looping over a sequence backwards."""
    def __init(self, data):
        self.data = data
        self.index = len(data)
    
    def __iter__(self):
        return self
    
    def __next__(self):
        # 反向输出 data
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]
posted @ 2022-09-18 21:29  ylyzty  阅读(19)  评论(0编辑  收藏  举报