因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际开发中用户都需要重写后才会使用。
一、内建属性__init__ 和 __new__ 的用法
class Dog(object): def __init__(self,a,b): print("init:a=%d b=%d"%(a,b)) print("----init----") def __new__(cls,a,b): print("----new----") print("new:a=%d b=%d" % (a, b)) return object.__new__(cls) dog=Dog(4,5)
二、内建属性__class__ 的属性
class Student(object): def __init__(self,name): self.name=name stu=Student("tom") print(type(stu),type(Student)) print(stu.__class__,Student.__class__,stu.__class__.__class__)
2.实例化的对象在打印或时会默认调用__str__方法,如果类没有重写这个方法,默认调用父类object的__str__方法。
3.object的__str__方法内部是pass,所以打印的是内存地址。如果当前类重写了这个方法,会自动调用重写后的方法。
class Student(object): def __init__(self,name): self.name=name stu=Student("tom") ls=[1,'ll','tt'] print(stu) print(ls)
输出:
<__main__.Student object at 0x7fb731ab7e48>
[1, 'll', 'tt']
def __init__(self,name):
self.name=name
def __str__(self):
print("我要可视化实例内容了")
return "student(%s)"%self.name
print(ls)
student(tom)
[1, 'll', 'tt']
2、__repr__的功能与用法
1.__repr__如果用IDE软件操作,功能与__str__完全一样,都是实例可视化显示
2.开发中如果用户需要可视化实例内容,只需要重写__str__或者__repr__方法之一即可。如果两个都有的话,默认调用__str__.
3.两者的区别就是使用命令行操作:
3.1__str__重写后,如果直接实例stu回车的话,显示的是stu实例在内存中的地址,跟print(stu)不一样。
3.2__repr__重写后,如果直接实例stu回车的话,效果跟使用print(stu)一样,返回内容,不是内存地址。
class Student(object): def __init__(self, name, age): self.name = name self.age = age def __str__(self): print("我是str") return "Student(%s,%d)" % (self.name, self.age) def __repr__(self): print("我是repr") return "Student11111(%s,%d)" % (self.name, self.age)
s1 = Student("JACK", 29) print(s1)
输出:
我是str
Student(JACK,29)
四、内建属性:__del__、__dict__
1.__del__的功能与用法:
1.当删除一个对象时,python解释器会默认这个方法为__del__()方法,用户也可以重写这个方法。
2.注意:当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2。
当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除,具体关于python的GC回收机制。
3.可以使用del删除绑定的属性,也可以直接删除对象。
总结:del的使用其实体验了python语言的动态性,可以在运行时绑定属性和方法,也可以在运行时删除属性和方法,甚至删除实例本身。具体参考博客:Python语言的动态性:运行时动态绑定,删除属性和方法
class Student(object): def __init__(self, name, age): self.name = name self.age = age def __str__(self): print("我是str") return "Student(%s,%d)" % (self.name, self.age) def __del__(self): # 重写父类object的__del__方法,不重写也可以直接使用__del__方法。 print("__del__方法被调用") print("%s对象马上被干掉了..." % self.name) s1 = Student("JACK", 29) print(s1) del s1 # 注意这里del在外部调用的方式 # print(s1) NameError: name 's1' is not defined '''结果如下: Student(JACK,29) __del__方法被调用 JACK对象马上被干掉了... ''' # 使用del删除绑定的属性 s1.sex = "male" print(s1.sex) # male del s1.sex # 注意这里del在外部调用的方式s #print(s1.sex) # 已删报错。
2.__dict__的功能和使用:
1.__dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值,类如属性,则字典是空的。
2.因为类也是对象,所以类和实例都有这个属性。
3.因为__dict__存储的是对象的属性键值对字典,所以有字典的特性,可以直接用K求V
4.注意:__dict__存储的类的普通属性,类属性不会放到__dict__中
class Student(object): country = "china" #类属性不会放到__dict__中 def __init__(self,name,age): self.name = name self.age = age def __str__(self): print("我是str") return "Student(%s,%d)"%(self.name,self.age) s1 = Student("JACK",29) print(s1.__dict__) print(s1.__dict__["name"]) #JACK print(Student.__dict__) ''' {'name': 'JACK', 'age': 29} JACK {'__module__': '__main__', '__init__': <function Student.__init__ at 0x0000026A3F637AE8>, '__str__': <function Student.__str__ at 0x0000026A3F637B70>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None} '''
五、内建属性:__getattribute__
class Tree(object): def __init__(self,name): self.name=name def __getattribute__(self, item): print("这里是属性访问器") return object.__getattribute__(self,item) aa=Tree("桃树") print(aa.name) 输出: 这里是属性访问器 桃树
def __init__(self,name):
self.name=name
self.name1="苹果树"
def __getattribute__(self, item):
print("这里是属性访问器")
if item=="name":
print("传来的是name")
return "桃树name"
else:
print("传来的不是name")
print(aa.name1)
六、其它内建属性
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
class Person(object): def __init__(self,name,age): self.name=name self.age=age class Employee(Person): """ 所有员工的基类 """ empCount=0 def __init__(self,name,age,salary): self.name=name self.age=age self.salary=salary Employee.empCount+=1 def displayCount(self): print("Total is %d"%Employee.empCount) def displayEmployee(self): print("name is %s,age is %d,salary is %d"%(self.name,self.age,self.salary)) print("Employee.__doc__:",Employee.__doc__) print("Employee.__name__:", Employee.__name__) print("Employee.__module__:", Employee.__module__) print("Employee.__bases__:", Employee.__bases__) print("Employee.__dict__:", Employee.__dict__) 输出: Employee.__doc__: 所有员工的基类 Employee.__name__: Employee Employee.__module__: __main__ Employee.__bases__: (<class '__main__.Person'>,) Employee.__dict__: {'__module__': '__main__', 'displayEmployee': <function Employee.displayEmployee at 0x7fc195bbbbf8>, 'empCount': 0, '__init__': <function Employee.__init__ at 0x7fc195bbbae8>, 'displayCount': <function Employee.displayCount at 0x7fc195bbbb70>, '__doc__': '\n 所有员工的基类\n '}
浙公网安备 33010602011771号