类的使用:实例化、属性引用

实例化

g1 = Garen('草丛伦1') # 实例化

g2 = Garen('草丛伦2')

g3 = Garen('草丛伦3')

类的属性:变量和函数

print(Garen.camp)

print(Garen.attack)

print(Garen.dict)

结果:
{'__module__': '__main__', '**camp**': 'Demecia', 'n': 3, '__init__': <function Garen.__init__ at 0x000000000231BB70>, '**attack**': <function Garen.attack at 0x000000000231BBF8>, '__dict__': <attribute '__dict__' of 'Garen' objects>, '__weakref__': <attribute '__weakref__' of 'Garen' objects>, '__doc__': None} 通过print(Garen.__dict__)能输出Garen类的名称空间,是一个字典,当我们进行使用的时候,实际是查找的是字典的key,通过key找相应的值 对类的变量的修改就是对其字典进行的修改:
```python
Garen.camp = '123' # 找到字典的key--camp,修改camp的值为123
Garen.x = '123' # 在字典中新增一组

对象

对象也有一个名称空间(这个名称空间中国只有变量),也是字典形式的,可以通过下面的方式进行新增:

g1.__dict__["12"]='123'
print(g1.__dict__)

结果:

{'nickname': '草丛伦1', 'aggressive': 58, 'life_value': 455, 'hobby': [], '12': '123'}

实例化的对象 对类的属性引用

对象首先是引用自身的属性,对象的名称空间中只有自己的属性

print(g1.nickname)   #引用自身的属性
print(g1.aggressive)
print(Garen.camp) # 自身没有,引用的是类的属性

类的属性是共享的,多个实例化的对象指向的是同一个变量的地址,是一样的内容,所以说是共享的

print(g1.camp,id(g1.camp))  # 通过id查看内存的地址
print(g2.camp,id(g2.camp))
print(g3.camp,id(g3.camp))

结果是:

Demecia 43096248

Demecia 43096248

Demecia 43096248

对象修改的是在自身的下面添加的,之后查找的时候是从首先从自己的内训寻找的

g1.camp = '1111'
print(g1.camp)
print(g2.camp)
print(g3.camp)

结果:

1111 # 查看的是自己内部的名称空间中的变量

Demecia

Demecia

小练习:对实例化的计数

关键: 每次实例化都会运行__init__,所以在init中写

class Garen:   # 下面是类的属性
camp = 'Demecia'
n = 0 # 定义的Garen类的变量,用于实例化次数的计数
def __init__(self,nickname,aggressive=58,life_value=455):
self.nickname = nickname
self.aggressive = aggressive
self.life_value = life_value Garen.n += 1 # 每次实例化后计数加一,Garen.n
self.hobby = [] def attack(self,enemy):
enemy.life_value -= self.aggressive #  # 实例化
g1 = Garen('草丛伦1') # 实例化
g2 = Garen('草丛伦2')
g3 = Garen('草丛伦3') print(g1.n) # 两种查看的方法
print(Garen.n)

结果:

3

3

绑定方法和函数

print(g1.attack)  # 绑定方法
print(Garen.attack) # 函数

结果:

bound method Garen.attack of <main.Garen object at 0x00000000024546A0>>

**function **Garen.attack at 0x000000000244BBF8>

print(g1.attack(g1))   # 绑定方法使用的时候是把自己g1传递给了self
print(Garen.attack(g1,g1)) # 函数需要传递两个参数

Python面向对象(三)的更多相关文章

  1. Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

  2. Python面向对象三要素-封装(Encapsulation)

    Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...

  3. Python面向对象(三)

    一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...

  4. Python面向对象三要素-多态

    Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...

  5. Python 面向对象三(转载)

    来源:Mr.Seven www.cnblogs.com/wupeiqi/p/4766801.html 四.类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三 ...

  6. python 面向对象三 访问权限 下划线 双下划线

    一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...

  7. python 面向对象(三)类与类之间的关系 初始化方法一些类

    ###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...

  8. python 面向对象(三)--继承和多态

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...

  9. Python 面向对象(三) 魔术方法

    __getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...

  10. python面向对象<三>

    类属性.实例属性: class Tool(object): #属性(类属性)类对象(Tool) num = 0 #方法 def __init__(self,new_name): self.name = ...

随机推荐

  1. CentOS 下部署Nginx+Gunicorn+Supervisor部署Flask项目

    原本之前有一部分东西是在Windows Server,但是由于Gunicorn不支持Windows部署起来颇为麻烦.最近转战CentOS,折腾一段时间,终于简单部署成功.CentOS新手,作为一个总结 ...

  2. Vue.js中,如何自己维护路由跳转记录?

    在Vue的项目中,如果我们想要做返回.回退操作时,一般会调用router.go(n)这个api,但是实际操作中,使用这个api有风险,就是会让用户跳出当前应用,因为它记录的是浏览器的访问记录,而不是你 ...

  3. 剑指Offer的学习笔记(C#篇)-- 二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  4. 原生JS和jQuery中基本的节点操作

    js中节点操作**document.createElement()**用来生成网页元素节点,参数为元素的标签名: **document.createTextNode()**用来生成文本节点,参数为所要 ...

  5. Django之分页升级版

    如果查询出的数据,被分页了,这个时候翻页的时候应该讲页数的参数和查询的参数一块在URL上显示 """ 分页器 """ from django ...

  6. CentOS,net core2 sdk nginx、supervisor、mysql

    CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建 作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把 ...

  7. NET Core 2.0 介绍和使用

    NET Core 2.0 特性介绍和使用指南 阅读目录 前言 特性概述 使用指南 .NET Core 2.0和1.0/1.1之间的关系 .NET CORE Rumtime改进 .NET Core SD ...

  8. C# 序列化与反序列化json

    与合作伙伴讨论问题,说到的c++与c#数据的转换调用,正好就说到了序列化与反序列化,同样也可用于不同语言间的调用,做了基础示例,作以下整理: using System.Data; using Syst ...

  9. 关于float和double类型能表示的数据范围和精度分析

    来自教材<计算机组成原理>p16 float:6--7位 double:15--16位 意思就是double类型的数据,你确实能表达出很大的数字,但是其只有15位是精确的. 1.计算机中, ...

  10. 日志AOP的实现

    /// <summary> /// 日志AOP拦截 /// </summary> [AttributeUsage(AttributeTargets.Method, AllowM ...