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]
标签:__,变量,Python,self,next,实例,class
From: https://www.cnblogs.com/ylyzty/p/16705878.html