一、私有化
'''以双下划线开头,以双下划线结尾的,python自带的,已经拥有特殊的含义自己属性或者函数不能这样命名'''class TSG: _a = 1 __b = 2 def _fun(self): print('如果人睡觉是为了做梦') def __fun2(self): return ('那我宁可不睡觉')s = TSG()print(s._a)s._fun()print(s._TSG__b) #实例._类名__私有属性 可以访问双下划线的私有属性
print(s._TSG__fun2())
二 、构造方法:__init__( ) 析构方法 :__del__( )
class Face: # 类的构造器/类的初始化 __init__ 方法,实例化的时候自动运行 def __init__(self,yourname,yourage,yoursex): self.name = yourname self.age = yourage self.sex = yoursex #类的析构器 将对象删除以释放内存,一般放在末尾,类执行完的时候自动删除对象 def __del__(self): print('%s已死,有事说事,没事多烧纸'%self.name)s = Face('张三','250','去过泰国')
结果:张三已死,有事说事,没事多烧纸
三、字符串的展示 1:对用户友好的:__str__( ) 2: 对开发者友好的:__repr__( )
class Adidas: def __init__(self,stunum,stuname,stubanji): self.num = stunum self.name = stuname self.banji = stubanji def __str__(self): return '我叫'+self.name+'学号是'+self.num+'是'+self.banji+'的学生'
a = Adidas('123456','Jim','钱学森实验1班')print(str(a))print(repr(a))
结果:
我叫Jim学号是123456是钱学森实验1班的学生 #此行是str打印的结果<__main__.Adidas object at 0x000001ECB379F940> #此行是继承的object的默认repr打印的结果,返回 的是一个类似内存地址的对象
两点注意:
1、在普通的Idle中 repr和str共存的话,那么str的优先级高于repr,程序默认执行str而不去执行repr
而在shell脚本模式或者称为交互模式下的话,只有repr,这就是为什么在shell中输入变量名就能打印 结果的原因
2、对于程序员来说我可能已经知道要打印什么结果或者说是已经测试过了,所以我就没有必要用str,这 样还能节省不必要的文本内存花销
1
四、属性操作的内置函数 设置属性 setattr() 获取属性 getattr() 归属问题的判断hasattr( ) 删除属性 delattr()
class Test: a = 'abc' b = 123 def fun(self,thing): self.thing = thing print(self.thing)t = Test() #实例化对象t#1、归属问题的判断,存在打印99乘法口诀if hasattr(t,'a'): #返回bool值, for i in range(1,10): for j in range(1,i+1): print('%s * %s = %2s'%(i,j,i*j),end = ' ') print(' ')#2、为t设置m属性,然后m的归属问题判断,存在就打印第10次斐波那契数列setattr(Test,'m',20)if hasattr(t,'m'): a = 0 b = 1 for i in range(10): a,b = a+b,a print(a)#3、查询属性值,查出属性m的值,并将其分解因数num = getattr(t,'m') #三个参数,查询实例属性,最后一个参数表示,如果查到了就返回原值,反之则返回最后一个参数while num != 1: for i in range(1, num + 1): if (num % i) == 0 and i != 1: num = num // i if num == 1: print (" %d"%i,end = ' ') else: print (" %d*"%i,end = ' ') break#查询和设置的嵌套使用print(getattr(t,'c',setattr(t,'c',456)))#4、删除对象属性delattr(Test,'a') #两个参数,实例或者类名, 实例不能删除共有的属性,类不能删除实例属性print(hasattr(t,'a'))
结果:
1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
以上不是乱码,是地方太小放不下
11235813213455
2* 2* 5 456
False
其他特殊的属性:__name__ __class__ __doc__ __dict__
在如上代码中加入
第一,__name__的使用
从#1前边一行加入(文件名为has_test)
if __name__ == '__main__':
(后边对应缩进)
后边的程序代码只有在当前也就是名为has_test的文件下运行才会被执行
当我用另外一个名为specialatrribute.py的文件调用刚才has_test时,后边的代码并不会被执行
from has_test import Test
class A:
pass
if __name__ == '__main__':
print(Test.__name__)
结果只有一个Test
#2、__class__的使用 from has_test import Test t = Test() print(t.__class__)
结果
<class 'has_test.Test'> (和type类似,但是类的__class__还是__class__)
#3、__doc__ 对class的文本标注
class C:
'''
这只是一个小测试
auther:Flexin_
data:2018.3.24
'''
pass
print(C.__doc__)
结果:
这只是一个小测试
auther:Flexin_
data:2018.3.24
#4、__dict__ 存储对象(实例)属性的字典
class D:
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c
d = D(1,2,3)
print(d.__dict__
结果:{'a': 1, 'b': 2, 'c': 3}