qiaoliang0302

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

      因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际开发中用户都需要重写后才会使用。

 

 

一、内建属性__init__  和  __new__   的用法

 
1.__init__第一个参数是self,表示需要初始的实例,由python解释器自动传入,而这个实例就是这个__new__返回的实例
2.然后 __init__在__new__的基础上可以完成一些其它初始化的动作
3.__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__功能与用法:
1.__class__功能和type()函数一样,都是查看对象所在的类。
2.__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__)

 

 三、内建属性__str__,__repr__
 
1、__str__的功能和用法
 
   1.__str__功能:将实例对象按照自定义的格式用字符串的形式显示出来,提高可读性。
   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']


class Student(object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        print("我要可视化实例内容了")
        return "student(%s)"%self.name
stu=Student("tom")
ls=[1,'ll','tt']
print(stu)
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)


输出:
这里是属性访问器
桃树




class Tree(object):
    def __init__(self,name):
        self.name=name
        self.name1="苹果树"
    def __getattribute__(self, item):
        print("这里是属性访问器")
        if item=="name":
            print("传来的是name")
            return "桃树name"
        else:
            print("传来的不是name")

            return object.__getattribute__(self,item)

aa=Tree("桃树")
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    '}

 

 

 

 

 

 

 

posted on 2019-02-11 22:43  qiaoliang0302  阅读(111)  评论(0)    收藏  举报