Python--类的高级特性

类对象的动态绑定

可以绑定变量和方法
如果需要绑定的方法来调用类内部的成员,该方法的第一个参数为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__
>>> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值