类对象的动态绑定
可以绑定变量和方法
如果需要绑定的方法来调用类内部的成员,该方法的第一个参数为self
动态绑定的变量与方法只作用于该对象
>>> class user_info(object):
... pass
...
>>> def foo():
... print('foo')
...
>>> def foo_class(self):
... print(self.name)
...
>>> u = user_info()
>>> u.name = 'root'
>>> u.pwd = 'admin'
>>> u.foo = foo
>>> u.foo_class = foo_class
>>> u.name
'root'
>>> u.pwd
'admin'
>>> u.foo()
foo
>>> u.foo_class()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo_class() missing 1 required positional argument: 'self'
类的静态成员
静态成员可以动态绑定, 也可以在类中直接声明
静态成员是属于类的, 不属于对象
>>> class user_info(object):
name = 'aaa'
>>> user_info.name
'aaa'
>>> a = user_info()
>>> a.name
'aaa'
>>> b = user_info()
>>> b.name
'aaa'
>>> a.name = 'bbb'
>>> a.name
'bbb'
>>> b.name
'aaa'
>>> user_info.name
'aaa'
>>> user_info.name = 'ccc'
>>> a.name
'bbb'
>>> b.name
'ccc'
>>>
在使用类的动态绑定的时候可能会出现误操作.
比如在给对象赋值时写错了变量名,就会变成动态绑定
>>> class user_info(object):
name = 'aaa'
>>> a = user_info()
>>> a.nama = 'bbb'#本意是给name赋值,结果绑定了一个nama的变量
可以使用slots方法来进行限定
>>> class cls_demo(object):
... __slots__ = ('name', 'pwd') # 只允许绑定 name 和 pwd
...
>>> demo1 = cls_demo()
>>> demo1.user = 'root'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'cls_demo' object has no attribute 'user'
>>> demo1.name = 'admin'
>>> demo1.name
'admin'
使用类的特性
>>> class user_info(object):
... def __init__(self, name, pwd):
... self.__name = name
... self.__pwd = pwd
...
... @property
... def name(self): # 特性, 只读
... return self.__name
... @name.setter
... def name(self, val): # 特性, 只写
... self.__name = val
...
>>> u = user_info('root', 'admin')
>>> print(u.name)
root
>>> u.name = 'aaa'# u.name实际是调用的上面的name方法,这种方式使得python代码变得优雅
>>> print(u.name)
aaa
>>>
遍历对象
实现 _ iter _ 和 _ next _ 函数
in的时候会调用 iter
for的时候会不断调用 next
>>> import random
>>> class user_info(object):
... def __init__(self, name, pwd):
... self.__name = name
... self.__pwd = pwd
... self.__loop = 10
...
... def __iter__(self):
... print('__iter__')
... self.__loop = 10 # 规定迭代次数
... return self
...
... def __next__(self):
... print('__next__')
... ret = random.randint(1, 1000)
... self.__loop -= 1
... if not self.__loop:
... raise StopIteration() # 停止迭代
... return ret
...
>>> u = user_info('root', 'admin')
>>> for i in u: # for会接收到StopIteration的异常从而退出循环
... print(i)
...
__iter__
__next__
542
__next__
498
__next__
483
__next__
353
__next__
156
__next__
893
__next__
624
__next__
682
__next__
541
__next__
>>>