Python面向对象(三)
类的使用:实例化、属性引用
实例化
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面向对象(三)的更多相关文章
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- Python面向对象(三)
一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...
- Python面向对象三要素-多态
Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...
- Python 面向对象三(转载)
来源:Mr.Seven www.cnblogs.com/wupeiqi/p/4766801.html 四.类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段.方法和属性三 ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
- python 面向对象(三)类与类之间的关系 初始化方法一些类
###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...
- python 面向对象(三)--继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- Python 面向对象(三) 魔术方法
__getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...
- python面向对象<三>
类属性.实例属性: class Tool(object): #属性(类属性)类对象(Tool) num = 0 #方法 def __init__(self,new_name): self.name = ...
随机推荐
- sqlserver的语句和mysql语句
感谢原创 sqlserver和mysql基本语句的对比 http://blog.csdn.net/kk185800961/article/details/47044751 sqlserver中常见的语 ...
- Netdata 是一款 Linux 性能实时监测工具
具体的netdata介绍请参照GIT:https://github.com/firehol/netdata/wiki 以下只介绍centos下的netdata的安装与使用: 1.安装Netdata需要 ...
- js 正则表达式学习笔记
正则表达式正则表达式是由一个字符序列形成的搜索模型 语法new RegExp("[abc]")/[abc]//正则表达式主体/修饰符(可选) 1.修饰符i 忽略大小写g 执行全局匹 ...
- 关于HTML5用SVG画图
SVG在HTML5中的应用 SVG(Scalable Vector Graphics)是用来绘制矢量图的HTML5标签.只要定义好XML属性就能够获得与其一致的图像元素. 使用SVG之前先将标签加入到 ...
- git小白的学习
1.1 Git介绍 1.1.1 什么是Git Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux ...
- Java获取上周,本周,本月,本年,开始结束时间 。日期工具类
由于获取日期经常会使用到,所有我自己写了一个工具类 1.基本上能用上的都写出来了,包括:1)获取当天的开始时间 2)获取当天的结束时间 3)获取昨天的开始时间 4)获取昨天的结束时间 5)获取明天的开 ...
- Luogu P1955 [NOI2015]程序自动分析
又一次做了这道题,感慨万千. 记得寒假时,被cmd2001点起来讲这道题,胡言乱语..受尽鄙视(现在也是好吗)..后来下课想A掉,可是3天下来总是错...后来抄了分题解就咕咕了... 今天老师留了这道 ...
- 湖南大学新生赛C,G,J题解
C: 思路:做几组数据就基本能发现规律,奇数为-1,偶数为1 代码: #include<cstdio> #include<iostream> #include<cstri ...
- hdu4570-区间dp
这道题的题意不是一般的难懂啊,各种查字典都没理解,还是没忍住去看了别人的博客,没想到题很简单,1-n内划分若干个区间,使的每个区间和最小,每个区间的区间和是:区间开头的数*2^区间长度. 区间dp # ...
- 使用表达式目录树实现SqlDataReader到实体的映射
SqlDataReader映射实体,是ORM的基础功能,常见的实现方式有反射.表达式目录树和emit,这里要说的就是用表达式目录树生成实体的方法. 先分析下思路: 假设有个数据实体类,Student ...