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']

 

posted @ 2019-07-17 07:32  尹正杰  阅读(218)  评论(0编辑  收藏  举报