20180724 (面向对象:类的命名空间和查询顺序丶组合)

一.类的名称空间

类名()  产生了一个含有对象指针的空间

先执行代码 从上向下执行

首先执行到class的时候,创建了一个Person类的空间,其中有静态变量和方法以及方法的内存地址

之后执行到p1 = Person()的时候,又创建了一个p1的实例空间,当还没读到括号里面的参数的时候,此时该实例空间里只有一个指示牌是指向Person类空间的

当执行到括号里面的内容的时候,此时实例空间里多了country = "菲律宾",name = "alex",age = 42,height = 175

查询顺序:  对象.属性:先从对象(实例)空间里面找,如果找不到,再从类的空间里面找,再找不到,到父类里面找

       类名.属性:先从本类空间里面找,如果找不到,就到父类找

对象与对象之间是相互独立的

例如:

  如图代码.如果p1下面有添加了一行代码(p2 = Person("美国","wusir","男",38,180))      则当程序执行到p2的时候就又创建了一个p2的实例空间,与p1是相互独立的,但都有一个指示牌,指向类Person空间

例如:

  计算一个类,实例化多少个对象

  class Person:

    count = 0

    def __init__(self):

      Person.count = Person.count(self.count 在这里是引用) + 1

    p1 = Person()

    p2 = Person()

    p3 = Person()

    Person.count = 6                    ======>通过类名可以更改我的类中的静态变量,但是通过对象,不能改变只能引用类中的静态变量

    print(Person.count)

二.组合    (给一个类的对象封装一个属性,这个属性是另一个类的对象)

例如:

  class Person:

    def __init__(self,name,ad,hp):

      self.name = name

      self.ad = ad

      self.hp = hp

    def attack(self,p):

      p.hp = p.hp - self.ad

      print("%s攻击了%s,%s掉了%s血,还剩%s血" % (self.name,p.name,p.name,self.ad,p.hp))

    def wuqi(self,wea):

      self.wea = wea

  class Weapons:

    def __init__(self,name,ad):

      self.name = name

      self.ad = ad

    def fight(self,p1,p2):

      p2.hp = p2.hp - self.ad

      print("%s拿%s攻击了%s,%s掉了%s血,还剩%s血" % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp))

  p1 = Person("盖伦",20,150)

  p2 = Person("提莫",50,100)

  w1 = Weapons("斧子",50)

  w2 = Weapons("双节棍",80)

  p1.attack(p2)                                  ===========>盖伦攻击了提莫,提莫掉了20血,还剩80血

  p1.wuqi(w1)

  p1.wea.fight(p1,p2)                           =======>盖伦拿斧子攻击了提莫,提莫掉了50血,还剩30血

原文地址:https://www.cnblogs.com/lhy979/p/9362007.html

时间: 2024-10-10 13:24:44

20180724 (面向对象:类的命名空间和查询顺序丶组合)的相关文章

python 2018.7.24 类空间,对象空间,查询顺序 ,组合

查询顺序: 对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找.... 类名.属性 : 先从本类空间找,如果找不到,再从父类找.... 对象与对象之间是互相独立的. 计算一个类 实例化多少对象.例 class Count: count = 0 def __init__(self): Count.count = self.count + 1 obj1 = Count() obj2 = Count() print(Count.count) count = 0 class

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以

面向对象,类名称空间,查找顺序,组合

# 程序从上往下一次把类的静态变量和方法全部加载进一个内存空间,直到遇到类名加括,实例化对象的时候会新开辟一个内存空间,# (会有一个类对象指针)在对象里面没找到目标会根据指针,去类里面找 # 查询顺序:# 对象.属性:先从对象空间找,如果找不到,再从类空间找,再找不到再从父类找# 类名.属性:先从本类空间找,如果找不到,再从父类找 类名称空间:在定义类的时候会开辟一个空间,这个空间里面装着所有的类class Person: animal='高级动物' soul='有灵魂' language='

面向对象进阶:命名空间和组合

面向对象的命名空间 属性:静态属性(直接和类名关联的对象或者直接定义在class下的变量).对象属性(在类内和self关联,在类外和对象名关联的变量) 类名操作变量 不管操作可变还是不可变数据类型 都是类中对应的变量发生变化对象名操作静态变量引用变量:先在自己的命名空间中查找,找不到就去类的命名空间找修改变量:如果是对可变数据类型中的元素进行修改,那么全局生效如果是对变量进行重新赋值,那么只是在对象自己的命名空间里增加了一个新的属性 class Foo: country = 'China' co

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

Lua面向对象----类、继承、多继承、单例的实现

(本文转载)学习之用,侵权立删! 原文地址   http://blog.csdn.net/y_23k_bug/article/details/19965877?utm_source=tuicool&utm_medium=referral lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现.

C++ Primer 学习笔记_73_面向对象编程 -再谈文本查询示范

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

图解Python 【第五篇】:面向对象-类-初级基础篇

由于类的内容比较多,分为类-初级基础篇和类-进阶篇 类的内容总览图: 本节内容一览图: 今天只讲类的基础的面向对象的特性 前言总结介绍: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数,对象是一个类的实例 实例(instance):一个对象的实例化实现. 标识(identity):每个对象的实例都需要一个可

类的命名空间&组合

类的命名空间◆类中的静态变量可以被类调用也可以被对象调用◆对不可变数据类型来说,类变量最好用类名操作 class Person: money = 0 mother = Person() father = Person() Person.money += 1000 Person.money += 1000 print(Person.money) ◆对于可变数据类型来说,对象的修改是共享的,重新赋值是独立的 class Course: langauage = 'Chinese' def __init