1."__var"--->私有属性,外部无法访问.无法直接被调用.
class ProtectMe:
def __init__(self):
self.me='qiwsir'
self.__name='kivi'
def __python(self):
print("I love python.")
def code(self):
print("Which language do you like?")
self.__python()
if __name__=='__main__':
p=ProtectMe()
#print(p.me)# qiwsir
# 无法调用私有的属性
#print(p.__name)# AttributeError
# 类内部,利用普通的方法去调用私有的方法,结果正确
p.code() # Which language do you like?I love python.
# 无法访问私有的方法
p.__python()# AttributeError
- 此时想访问私有的属性---@property
以后看到"@"这种"语法糖",纯粹是为语法服务的,不必太过惊奇.
class ProtectMe:
def __init__(self):
self.me='qiwsir'
self.__name='kivi'
# 表示属性
@property
def name(self):
return self.__name
if __name__=='__main__':
p=ProtectMe()
# 访问的方法,感觉是调用name函数对象的属性
print(p.name) # 用属性的方式去访问
- 另一种方法,不使用@property
class ProtectMe:
def __init__(self):
self.me='qiwsir'
self.__name='kivi'
# 仍然使用类的方法去返回
def getname(self):
return self.__name
if __name__=='__main__':
p=ProtectMe()
# 调用这个函数(上面的例子是用访问属性的形式调用的)
print(p.getname())
>>>
kivi
2.定制类---一些特殊的方法,开头结尾都是双下划线,类会自动调用该方法,无须手动
class Studentc:
def __init__(self,name):
self.__name=name
"""def __str__(self):
return "Student object (name:{})".format(self.__name)"""
print(Studentc('cc'))
>>>
# 无法显示内容"cc"
<__main__.Studentc object at 0x0000000003108B38>
- 进阶
class Studentc:
def __init__(self,name):
self.__name=name
# 类自动调用该方法
def __str__(self):
return "Student object (name:{})".format(self.__name)
#加不加这句这里是一样的
#属性赋值,我是这么理解
#__repr__ = __str__
print(Studentc('cc'))
>>>
Student object (name:cc)
- 别人的实例:关于
__len__
如果一个类表现得像一个list,要获取有多少个元素,就得用 len() 函数。
要让 len() 函数工作正常,类必须提供一个特殊方法len(),它返回元素的个数。
例如,我们写一个 Students 类,把名字传进去:
class Students(object):
def __init__(self, *args):
self.names = args
def __len__(self):
return len(self.names)
只要正确实现了len()方法,就可以用len()函数返回Students实例的“长度”:
>>> ss = Students('Bob', 'Alice', 'Tim')
>>> print len(ss)
3```
上面如果把特殊的len()注释掉,就会提示:
Traceback (most recent call last):
File "C:\Users\wcw\Desktop\Testing.py", line 10, in <module>
print(len(ss))
TypeError: object of type 'Student' has no len()
网友评论