Python类提供了面向对象编程的所有标准特性:类继承机制允许多个基类,派生类可以重写其基类的任何方法,子类方法可以调用具有相同名称的基类的方法。对象可以包含任意数量和种类的数据(Objects can contain arbitrary amounts and kinds of data)。

用C++的术语,Python的类成员(包括数据成员)是公共的(除了下面的私有变量之外,在Python中可以通过在属性变量名前加上双下划线定义属性为private;添加_变成protected),并且所有成员函数都是虚拟的。

虚函数:A virtual function is a member function which is declared within a base class and is re-defined(Overriden) by a derived class. When you refer to a derived class object using a pointer or a reference to the base class, you can call a virtual function for that object and execute the derived class’s version of the function. 

类就像一个对象构造函数,或者是创建对象的“蓝图”。(A Class is like an object constructor, or a "blueprint" for creating objects.).

class MyClass:x1 = 5p1 = MyClass()print(p1.x1)class Child(MyClass):x2 = 6c2 = Child()print(c2.x1)
print(c2.x2)

In Python, class is an executable statement. When the interpreter finds a class statement, then first all the code in the class statement block is executed (in a special namespace), then all names defined in that block are used to build the class object (Python classes are objects), and finally 类属性 is bound to the class object in the current scope.

断点调试,程序先执行到2行,说明 class is an executable statement, 所有类内代码会按照脚本执行顺序依次执行. x1=5 会保存到MyClass class object 的命名空间中.执行到5和6行,用MyClass创建p1和p2两个实例的时候,会拷贝MyClass class object 的命名空间到p1和p2的object的命名空间内.此后,p1和p2两个object的命名空间彼此互相独立互不干扰.

所以,执行到第9行时,p1.x1被改为4,可是p2的x1还是初始值5.

继续向下执行,当执行完13行的时候,发现新创建的Child Class Object内部不光有属性x2=6,还有从

父亲MyClass Class Object命名空间里面拷贝过来的x1=5.

继续向下执行,当执行完16行的时候,c2 Object的命名空间直接用Child Class Object的命名空间复制生成,所以最后两行打印如下:

5
6

命名空间:A namespace is a mapping from names to objects. Examples of namespaces are: the set of built-in names (containing functions such as abs(), and built-in exception names); the global names in a module; and the local names in a function invocation. The set of attributes of an object also form a namespace. 

名称空间是在不同的时刻创建的,具有不同的生命周期。包含内置名称的名称空间是在Python解释器启动时创建的,并且永远不会被删除。在读入模块定义时创建模块的全局命名空间;通常,模块名称空间也会持续到解释器退出。解释器的顶级调用执行的语句(从脚本文件读取或以交互方式执行)被视为名为_main__的模块的一部分,因此它们有自己的全局名称空间。(内置名称实际上也存在于模块中;这称为内置名称。)

虽然命名空间是静态定义的,但它们是动态使用的。在执行过程中的任何时候,都有3或4个嵌套作用域的命名空间可以直接访问

关于The __init__() Function

the __init__() function to assign values to object properties, or other operations that are necessary to do when the object is being created.

class Person:def __init__(self, name, age):self.name = nameself.age = agep1 = Person("John", 36)print(p1.name)
print(p1.age)

__init__()方法在执行类定义的时候不会具体的执行(只会定义),所以里面定义的属性不是类的属性,仅仅是类实例的动态属性,所以不会被子类继承或覆盖.

参考:

9. Classes — Python 3.9.7 documentationhttps://docs.python.org/3/tutorial/classes.html

https://www.w3schools.com/python/python_classes.asphttps://www.w3schools.com/python/python_classes.asp

Python的类和继承中的属性变量相关推荐

  1. Python Class 类的继承与多继承

    Python Class 类的继承与多继承 1.继承概念 2.继承中的访问控制 3.示例 3.1 示例 1 3.2 示例 2 3.3 示例 3 3.4 示例 4 3.5 示例 5 3.6 示例 6 3 ...

  2. JAVA 类的继承(私有属性、自动转型)(入门级小白一看就懂)

    JAVA 类的继承 文章目录 JAVA 类的继承 概述 1. 类的继承 1.1 引言 1.2 继承的定义 1.3 继承的规则 1.4 继承的格式 1.5 类的继承实例分析 2 私有属性 3 自动转型 ...

  3. python中静态变量和静态方法_python类和函数中使用静态变量的方法

    本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossib ...

  4. 【python】-- 类的继承(新式类/经典类)、多态

    继承 之前我们说到了类的公有属性和类的私有属性,其实就是类的封装,现在准备随笔的 是继承,是面向对象的第二大特性. 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是 ...

  5. python自定义异常类一般继承于_自定义异常类一般继承自_______或其子类。

    [填空题]Python语句print('%d%%%d'%(3/2, 3%2))的运行结果是( 1 ). [填空题]自定义异常类一般继承自_______或其子类. [填空题]Python语句" ...

  6. 给Python的类和对象动态增加属性和方法

    通常我们会将编程语言分为静态和动态.静态语言的变量是在内存中的有类型的且不可变化的,除非强制转换它的类型:动态语言的变量是指向内存中的标签或者名称,其类型在代码运行过程中会根据实际的值而定.Pytho ...

  7. python封装:隐藏对象中的属性或方法(三分钟读懂)

    封装:隐藏对象中的属性或方法 隐藏对象中的属性 隐藏:- 将对象的属性名,修改为一个外部不知道的名字 我们使用时,有特殊方法来处理获取(修改)对象中的属性 获取(修改)对象中的属性 需要提供一个get ...

  8. 通过拦截器获取控制类requestMapping注解中的属性值

     1.控制类: /*** 根据id删除*/@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE,n ...

  9. Python学习-类的继承

    1 继承: 2 #python2 经典类是按深度优先来继承的,新式类是按广度优先来继承的 3 #python3 经典类和新式类都是按广度优先来继承的 4 5 6 7 #经典类:class People ...

  10. Java 继承中的属性隐藏与方法重写

    一.变量隐藏--变量不具有多态性 Java 中的变量不遵循多态性,所以重写仅适用于方法,而不适用于变量. 并且,当子类中的实例变量与父类中的实例变量具有相同的名称时,则从引用类型中选择该实例变量. 在 ...

最新文章

  1. C++ 定时器的用法:SetTimer和Ontimer
  2. 权威解读 | 人类社会正进入DT时代 如何激活生产力?
  3. 【最小环】【Floyed】观光旅游(ssl 1763)
  4. 11个小技巧,玩转Spring!
  5. java服务器要二次编译,ecology项目二次开发环境搭建
  6. 【File操作】Java实现导出ZIP压缩包
  7. eclipse 配色方案
  8. 视频营销自动赚钱秘诀
  9. s7200cpu224xp手册_西门子plc s7-200系列|s7-200 cpu224xp|CPU224 XP 高速I/O
  10. QQ,MSN,旺旺在线客服代码
  11. 什么是c语言函数,C语言中的函数是什么意思
  12. python修改系统时间_python修改操作系统时间的方法
  13. 是否有免安装的oracle,免安装的Oracle客户端
  14. Laravel 存在SQL注入漏洞
  15. ubuntu系统忘记密码(win+ubuntu双系统)
  16. USB Type A/B/C的区别和基本知识
  17. ibm服务器三个硬盘一般raid,ibmx335/ibmx336服务器做RAID阵列的图文方法(包括删除RAID阵列)...
  18. 【构造】Colored Rooks
  19. ABAQUS学习(2):Abaqus求解好后导出点坐标/位移/应变
  20. 撷半盏时光,叙岁月无恙。

热门文章

  1. 依赖注入的两种常用方式(构造器和Setter)与注入内容(装配数据)——Spring IOC/DI(三)
  2. golang 查询mysql_Golang查询MySQL数据库
  3. 关闭eslink:报错:Unexpected tab character no-tabs
  4. qtcpserver无法启动监听_EOS基础全家桶(四)启动节点
  5. nodejs mysql 增删改查_#NodeJS# MySQL的介绍安装使用以及使用NodeJS链接MySQL实现增删改查...
  6. python的if语句后面怎么加布尔运算符号是_10、python---- if布尔条件控制语法(二)...
  7. 基于数组的一个简单增删改查
  8. StanfordDB class自学笔记 (1) 数据库系统简介
  9. thymealf 高级用法_mybatis基础系列(四)——关联查询、延迟加载、一级缓存与二级缓存...
  10. 雷达最大不模糊速度_雷达基础知识:案例计算