Pthon面向对象-特殊属性

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

一.特殊属性

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie class Person:
"""
This is Class doc .
"""
def __init__(self,name,age = 18):
"""
This is instance doc .
"""
self.__name = name
self.__age = age @property
def name(self):
return self.__name @name.setter
def name(self,name):
self.__name = name p1 = Person("Jason Yin",20)
print(p1.name) print(Person.__name__,p1.__class__.__name__) #显示类,函数,方法的名称 print(Person.__module__,p1.__module__) #显示类所在的模块名 print(Person.__class__,p1.__class__) #类或者对象所属的类 print(Person.__bases__) #类的基类的元组,顺序为他们在基类列表中出现的顺序 print(Person.__doc__,p1.__doc__) #类,函数的文档字符串,如果没有定义则为None print(Person.__mro__) #类的mro(Method Resolution Order),即方法解析顺序,它和"class.mro()"返回的结果保存在"__mro__"中 print(Person.__dict__,p1.__dict__) #类或者实例的属性,可写的字典 print(Person.__dir__,p1.__dir__()) #返回类或者对象的所有成员名称列表

二.查看属性

1>.__dir__ 方法

  该属性返回类或者对象的所有成员名称列表。dir()函数操作实例就是调用__dir__()。

  如果dir([obj])的obj包含方法__dir__(),该方法将被调用。如果参数obj不包含__dir__(),该方法将最大限度地收集属性信息。

2>.dir(obj)对于不同的对象具有不同的行为

  如果对象是模块对象,返回的列表包含模块的属性名和变量名。

  如果对象是类型或者说是类对象,返回的列表包含类的属性名及它的祖先类的属性名。

  如果是类的实例需要注意以下两点:
    有__dir__方法,返回可迭代对象的返回值。
    没有__dir__方法,则尽可能收集实例的属性名,类的属性和祖先类的属性名。   如果obj不写,返回列表包含内容不同。
    在模块中,返回模块的属性和变量名。
    在函数中,返回本地作用域的变量名。
    在方法中,返回本地作用域的变量名。

3>.animal.py测试内容

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie class Animal:
x = 123
def __init__(self,name):
self._name = name
self.__age = 10
self.weight = 20 print('Animal module \'s names = {}'.format(dir())) #显示模块的属性名称 #以上代码执行结果如下:
Animal module 's names = ['Animal', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

4>.test.py(需要用到上面animal模块)

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie import animal
from animal import Animal class Cat(Animal):
name = '布偶'
age = 3 class Dog(Animal):
def __dir__(self):
return ["dog"] #"__dir__"魔术方法必须返回可迭代对象。 print("{0} 我是分割线 {0}".format("*" * 20)) print("Current module\'s names = {}".format(dir())) #模块名词空间内的属性 print("animal module\'s names = {}".format(dir(animal))) #指定模块名称空间内的属性 print("Animal's dir() = {}".format(dir(Animal))) #类Animal的dir() print("Cat's dir() = {}".format(dir(Cat))) #类Cat的dir() print("Dog's dir() = {}".format(dir(Dog))) #类Dog的dir() print("object's __dict__ = {}".format(sorted(object.__dict__.keys()))) #查看object的字典 print("{0} 我是分割线 {0}".format("*" * 20)) tom = Cat('Tom')
print(sorted(dir(tom))) #实例tom 的属性,Cat类及所有祖先类的类属性
print(sorted(tom.__dir__())) #同上,因此我们可以总结dir方法等效于下面的写法
print(sorted(set(tom.__dict__.keys())| set(Cat.__dict__.keys()) | set(object.__dict__.keys()))) print("{0} 我是分割线 {0}".format("*" * 20)) dog = Dog('二哈')
print(dir(dog))
print(dog.__dict__) #以上代码执行结果如下:
Animal module 's names = ['Animal', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
******************** 我是分割线 ********************
Current module's names = ['Animal', 'Cat', 'Dog', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'animal']
animal module's names = ['Animal', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
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']
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']
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']
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__']
******************** 我是分割线 ********************
['_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']
['_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']
['_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']
******************** 我是分割线 ********************
['dog']
{'_name': '二哈', '_Animal__age': 10, 'weight': 20}

5>.内建函数locals(),globals()与dir()之间的关系

 #!/usr/bin/env python
#_*_conding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie """
locals() 返回当前作用域中的变量字典
globals() 当前模块全局变量的字典
""" class Person:
def show(self):
a = 100
t = int(a)
print(dir())
print(locals()) def test(a=50,b=100):
c = 150
print(dir())
print(locals()) Person().show() print("{0} 我是分割线 {0}".format("*" * 20)) test() print("{0} 我是分割线 {0}".format("*" * 20)) print(dir())
print(sorted(locals().keys()))
print(sorted(globals().keys())) #以上代码执行结果如下:
['a', 'self', 't']
{'self': <__main__.Person object at 0x0000015CDA8D7448>, 'a': 100, 't': 100}
******************** 我是分割线 ********************
['a', 'b', 'c']
{'a': 50, 'b': 100, 'c': 150}
******************** 我是分割线 ********************
['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test']
['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test']
['Person', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'test']

Pthon面向对象-特殊属性的更多相关文章

  1. Pthon面向对象-补充知识

    Pthon面向对象-补充知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.tracemalloc 标准库tracemalloc,可以统计内存使用情况,通过下面的案例可以看出内 ...

  2. Pthon面向对象-异常处理

    Pthon面向对象-异常处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.异常概述 1>.错误(Error) 逻辑错误: 算法写错了,例如加法写成了减法. 笔误: 例如 ...

  3. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  4. python 面向对象 私有属性

    __init__构造函数 self.name = name # 属性, 实例变量,成员变量,字段 def sayhi()# 方法, 动态属性 私有属性不对外看到 前面加上__ class role() ...

  5. python入门(十四):面向对象(属性、方法、继承、多继承)

    1.任何东西1)属性(特征:通常可以用数据来描述)(类变量和实例变量)2)可以做一些动作(方法) 类来管理对象的数据.属性:类变量和实例变量(私有变量)方法:    1)实例方法    2)类方法   ...

  6. python 面向对象 公有属性

    公有属性定义  公有属性也叫作类变量  静态字段 class role(): # 传参数 # 公有属性都在这里定义 # 在类里直接定义的属性即是公有属性 nationality = 'JP' def ...

  7. 面向对象property属性、静态方法和类方法

    一.property属性 1.什么是property特性? property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值. from math import pi class Circl ...

  8. Python面向对象之类属性类方法静态方法

    类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...

  9. ~~核心编程(二):面向对象——类&属性~~

    进击のpython 类&属性 虽然我们上一part写了一个面向对象的程序:人狗大战 但是如果在面向对象来看 你这些的就不够规范 你既然选择用面向对象的思想来写 那你就要符合人家的定义规范和操作 ...

随机推荐

  1. winform窗口关闭,进程没有关掉的解决办法

    /// <summary> /// 窗口关闭删除所有活动线程 /// </summary> /// <param name="sender">& ...

  2. InvokeMember 使用(转http://blog.csdn.net/gooer/article/details/2927113)

    函数原型:       public   object   InvokeMember(string,   BindingFlags,   Binder,   object,   object[]); ...

  3. ThinkPHP3(结构,路由,模板的调用,后台搭建,系统常量)

    ThinkPHP的结构如下: 在ThinkPHP\Library\Think文件夹中,几个重要的文件 1.App.class.php 框架核心类文件 2.Think.class.php 每次请求都要执 ...

  4. ChecklistForTest

    相关字段内容较长时,页面显示是否正确(包括各主页面.明细页面.打印预览页面) 数据量较多时,页面显示是否正确(包括各主页面.明细页面.打印预览页面) 各字段为空校验(都为空,部分为空,都不为空)是否正 ...

  5. JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。

    JVM的本地方法栈   对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方 ...

  6. SQL Server 中的Merge关键字(转载)

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  7. Vue框架(三)——Vue项目搭建和项目目录介绍、组件、路由

    Vue项目环境搭建 1) 安装node,在官网下载好,然后在本地安装 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ 2) 换源安装cnpm >: npm ins ...

  8. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  9. 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

    一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] ...

  10. Vivado关联Notepad++

    Vivado自带的编辑器非常难看,我习惯用Notepad++,这里记录一下二者的关联. 1.打开Vivado,点击 Tools --- Settings --- Text Editor,右侧选择 Cu ...