Pthon面向对象-特殊属性
Pthon面向对象-特殊属性
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.特殊属性
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 7 class Person: 8 """ 9 This is Class doc . 10 """ 11 def __init__(self,name,age = 18): 12 """ 13 This is instance doc . 14 """ 15 self.__name = name 16 self.__age = age 17 18 @property 19 def name(self): 20 return self.__name 21 22 @name.setter 23 def name(self,name): 24 self.__name = name 25 26 p1 = Person("Jason Yin",20) 27 print(p1.name) 28 29 print(Person.__name__,p1.__class__.__name__) #显示类,函数,方法的名称 30 31 print(Person.__module__,p1.__module__) #显示类所在的模块名 32 33 print(Person.__class__,p1.__class__) #类或者对象所属的类 34 35 print(Person.__bases__) #类的基类的元组,顺序为他们在基类列表中出现的顺序 36 37 print(Person.__doc__,p1.__doc__) #类,函数的文档字符串,如果没有定义则为None 38 39 print(Person.__mro__) #类的mro(Method Resolution Order),即方法解析顺序,它和"class.mro()"返回的结果保存在"__mro__"中 40 41 print(Person.__dict__,p1.__dict__) #类或者实例的属性,可写的字典 42 43 print(Person.__dir__,p1.__dir__()) #返回类或者对象的所有成员名称列表
二.查看属性
1>.__dir__ 方法
该属性返回类或者对象的所有成员名称列表。dir()函数操作实例就是调用__dir__()。
如果dir([obj])的obj包含方法__dir__(),该方法将被调用。如果参数obj不包含__dir__(),该方法将最大限度地收集属性信息。
2>.dir(obj)对于不同的对象具有不同的行为
如果对象是模块对象,返回的列表包含模块的属性名和变量名。
如果对象是类型或者说是类对象,返回的列表包含类的属性名及它的祖先类的属性名。
如果是类的实例需要注意以下两点:
有__dir__方法,返回可迭代对象的返回值。
没有__dir__方法,则尽可能收集实例的属性名,类的属性和祖先类的属性名。
如果obj不写,返回列表包含内容不同。
在模块中,返回模块的属性和变量名。
在函数中,返回本地作用域的变量名。
在方法中,返回本地作用域的变量名。
3>.animal.py测试内容
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 class Animal: 7 x = 123 8 def __init__(self,name): 9 self._name = name 10 self.__age = 10 11 self.weight = 20 12 13 print('Animal module \'s names = {}'.format(dir())) #显示模块的属性名称 14 15 16 17 #以上代码执行结果如下: 18 Animal module 's names = ['Animal', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
4>.test.py(需要用到上面animal模块)
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import animal 7 from animal import Animal 8 9 class Cat(Animal): 10 name = '布偶' 11 age = 3 12 13 class Dog(Animal): 14 def __dir__(self): 15 return ["dog"] #"__dir__"魔术方法必须返回可迭代对象。 16 17 print("{0} 我是分割线 {0}".format("*" * 20)) 18 19 print("Current module\'s names = {}".format(dir())) #模块名词空间内的属性 20 21 print("animal module\'s names = {}".format(dir(animal))) #指定模块名称空间内的属性 22 23 print("Animal's dir() = {}".format(dir(Animal))) #类Animal的dir() 24 25 print("Cat's dir() = {}".format(dir(Cat))) #类Cat的dir() 26 27 print("Dog's dir() = {}".format(dir(Dog))) #类Dog的dir() 28 29 print("object's __dict__ = {}".format(sorted(object.__dict__.keys()))) #查看object的字典 30 31 print("{0} 我是分割线 {0}".format("*" * 20)) 32 33 tom = Cat('Tom') 34 print(sorted(dir(tom))) #实例tom 的属性,Cat类及所有祖先类的类属性 35 print(sorted(tom.__dir__())) #同上,因此我们可以总结dir方法等效于下面的写法 36 print(sorted(set(tom.__dict__.keys())| set(Cat.__dict__.keys()) | set(object.__dict__.keys()))) 37 38 print("{0} 我是分割线 {0}".format("*" * 20)) 39 40 dog = Dog('二哈') 41 print(dir(dog)) 42 print(dog.__dict__) 43 44 45 46 #以上代码执行结果如下: 47 Animal module 's names = ['Animal', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] 48 ******************** 我是分割线 ******************** 49 Current module's names = ['Animal', 'Cat', 'Dog', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'animal'] 50 animal module's names = ['Animal', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] 51 Animal's dir() = ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x'] 52 Cat's dir() = ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'x'] 53 Dog's dir() = ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x'] 54 object's __dict__ = ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 55 ******************** 我是分割线 ******************** 56 ['_Animal__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_name', 'age', 'name', 'weight', 'x'] 57 ['_Animal__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_name', 'age', 'name', 'weight', 'x'] 58 ['_Animal__age', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_name', 'age', 'name', 'weight'] 59 ******************** 我是分割线 ******************** 60 ['dog'] 61 {'_name': '二哈', '_Animal__age': 10, 'weight': 20}
5>.内建函数locals(),globals()与dir()之间的关系
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 7 """ 8 locals() 返回当前作用域中的变量字典 9 globals() 当前模块全局变量的字典 10 """ 11 12 class Person: 13 def show(self): 14 a = 100 15 t = int(a) 16 print(dir()) 17 print(locals()) 18 19 def test(a=50,b=100): 20 c = 150 21 print(dir()) 22 print(locals()) 23 24 Person().show() 25 26 print("{0} 我是分割线 {0}".format("*" * 20)) 27 28 test() 29 30 print("{0} 我是分割线 {0}".format("*" * 20)) 31 32 print(dir()) 33 print(sorted(locals().keys())) 34 print(sorted(globals().keys())) 35 36 37 38 #以上代码执行结果如下: 39 ['a', 'self', 't'] 40 {'self': <__main__.Person object at 0x0000015CDA8D7448>, 'a': 100, 't': 100} 41 ******************** 我是分割线 ******************** 42 ['a', 'b', 'c'] 43 {'a': 50, 'b': 100, 'c': 150} 44 ******************** 我是分割线 ******************** 45 ['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test'] 46 ['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test'] 47 ['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test']
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/11198637.html