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

实例化

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. Ext.apply(src,apply) 和 Ext.applyIf(src,apply)比较(转)

    Ext.onReady(function(){ /* * Ext.apply(src,apply) 和 Ext.applyIf(src,apply) 两个方法的使用和区别比较 */ //Ext.app ...

  2. aimOffset注意事项

    AimOffset的记录 AimOffset是什么,就是动画(相对于某个具体姿势比如待机动作的)叠加. AimOffset有什么用,简单说就是叠加动作,比如无双中骑马挥刀动作叠加. 注意步骤 1所有分 ...

  3. 洛谷P1005 矩阵取数游戏

    P1005 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次 ...

  4. 动手写一个简单版的谷歌TPU

    谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1(后简称TPU)相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU ...

  5. ajax对象。同步与异步及ajax发送请求

    ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了 ...

  6. 基于SSM搭建网站实现增删改查

    网站源码地址:https://github.com/MyCreazy/BasicOperateWebSite.git 使用maven搭建网站的时候,记得选用war包格式,有时候maven包没有引用进来 ...

  7. mysql导入文件

    手里有一个web源码工程文件夹 mysql导入文件: 新建连接,名称随意,用修改设置的用户密码登录,我的连接名称是eee 右击information_schema,建立数据库,数据库名称源码文件名,字 ...

  8. 常用的js工具函数

    JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1.通过ID选取元素document.getElementById('myid');2.通过CLASS选取元素do ...

  9. BZOJ 4236: JOIOJI map瞎搞

    分别记录J,O,I,的个数 cnt[char][i] 表示处理到第i位,char的个数 显然当且仅当 cnt[J][i] - cnt[O][i] == cnt[J][j-1] - cnt[O][j-1 ...

  10. java.sql.SQLException: No suitable driver found for jdbc:hive://localhost:10000/default

    error: java.sql.SQLException: No suitable driver found for jdbc:hive://localhost:10000/default at ja ...