1、属性查找

类有两种属性:数据属性函数属性


(1)类的数据属性是所有对象共享的

#类的数据属性是所有对象共享的,id都一样
class OldboyStudent:
school='oldboy'
def learn(self):
print('is learning') def eat(self):
print('is eating') def sleep(self):
print('is sleeping')
s1=OldboyStudent()
s2=OldboyStudent()
s3=OldboyStudent()
print(id(OldboyStudent.school))
print(id(s1.school))
print(id(s2.school))
print(id(s3.school))
结果:

31409128
31409128
31409128
31409128

(2)类的函数数据是绑定给对象用的,称为绑定到对象的方法

#类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
class OldboyStudent:
school='oldboy'
def learn(self):
print('is learning') def eat(self):
print('is eating') def sleep(self):
print('is sleeping')
s1=OldboyStudent()
s2=OldboyStudent()
s3=OldboyStudent()
print(OldboyStudent.learn)
print(s1.learn)
print(s2.learn)
print(s3.learn) 结果:

<function OldboyStudent.learn at 0x0000000001E94268>
<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x0000000001E86A90>>
<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x0000000001E86D68>>
<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x0000000001E86DA0>>

#ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准

2、绑定方法

定义类并实例化三个对象

class OldboyStudent:
school='oldboy'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def learn(self):
print('%s is learning' %self.name) #新增self.name def eat(self):
print('%s is eating' %self.name) def sleep(self):
print('%s is sleeping' %self.name) s1=OldboyStudent('李坦克','男',18)
s2=OldboyStudent('王大炮','女',38)
s3=OldboyStudent('牛榴弹','男',78)
#类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
OldboyStudent.learn(s1)
OldboyStudent.learn(s2)
OldboyStudent.learn(s3)
结果:

李坦克 is learning
王大炮 is learning
牛榴弹 is learning

类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法

强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)

s1.learn() #等同于OldboyStudent.learn(s1)
s2.learn() #等同于OldboyStudent.learn(s2)
s3.learn() #等同于OldboyStudent.learn(s3)

注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。

3、类即类型

python 中一切皆为对象,且python3中类与类型是一个概念,类型就是类

#类型dict就是类dict
>>> list
<class 'list'> #实例化的到3个对象l1,l2,l3
>>> l1=list()
>>> l2=list()
>>> l3=list() #三个对象都有绑定方法append,是相同的功能,但内存地址不同
>>> l1.append
<built-in method append of list object at 0x10b482b48>
>>> l2.append
<built-in method append of list object at 0x10b482b88>
>>> l3.append
<built-in method append of list object at 0x10b482bc8> #操作绑定方法l1.append(3),就是在往l1添加3,绝对不会将3添加到l2或l3
>>> l1.append(3)
>>> l1
[3]
>>> l2
[]
>>> l3
[]
#调用类list.append(l3,111)等同于l3.append(111)
>>> list.append(l3,111) #l3.append(111)
>>> l3
[111]

4、练习

练习1:编写一个学生类,产生一堆学生对象, (5分钟)

要求:

  1. 有一个计数器(属性),统计总共实例了多少个对象
class Students:
school = 'wuhan_university'
count = 0
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
self.count += 1
Students.count += 1 def learn(self):
print(f"{self.name},lean too much")
def playgame(self):
print(f"{self.name},playgame too much")
def sleep(self):
print(f"{self.name},sleep too much") s1 = Students('xiao','man',18)
s2 = Students('lele','man',20)
s3 = Students('dawang','man',23)
print(Students.count)#所有对象的
print(s1.count)#算单个对象的
输出结果:
3
1

练习2:模仿王者荣耀定义两个英雄类, (10分钟)

要求:

  1. 英雄需要有昵称、攻击力、生命值等属性;
  2. 实例化出两个英雄对象;
  3. 英雄之间可以互殴,被殴打的一方掉血,血量小于0则判定为死亡。
class hero():
role = '战士'
def __init__(self,name,atk,blood):
self.name = name
self.atk = atk
self.blood = blood
def attack(self,enemy):
enemy.blood = enemy.blood - self.atk
print(f"英雄{enemy.name}剩余血值{enemy.blood}--被英雄{self.name}攻击一次")
if enemy.blood < 0:
print(f"英雄{enemy.name}已阵亡")
else:
pass class hero2():
role2 = '法师'
def __init__(self,name,atk,blood):
self.name = name
self.atk = atk
self.blood = blood
def attack(self, enemy):
enemy.blood = enemy.blood - self.atk
print(f"英雄{enemy.name}剩余血值{enemy.blood}--被英雄{self.name}攻击一次")
if enemy.blood < 0:
print(f"英雄{enemy.name}已阵亡")
else:
pass s1 = hero('德玛西亚',100,1000)
s2 = hero2('瑞文',200,1000)
print(s2.name,s2.blood)
s1.attack(s2)
print(s2.name,s2.blood)

python 3 属性查找与绑定方法的更多相关文章

  1. Python类属性访问的魔法方法

    Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- ...

  2. python面向编程:类继承、继承案例、单继承下属性查找、super方法

    一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...

  3. python 面向对象之多态与绑定方法

    多态与多态性 一,多态 1,多态指的是一类事物有多种形态(python里面原生多态) 1.1动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.AB ...

  4. python中类与对象及其绑定方法的定义

    面向对象编程 什么是面向对象? 面向过程:将需要解决的问题按步骤划分,一步一步完成每一个步骤,而且          步骤之间有联系. 优点:复杂问题可以分步完成 缺点:扩展性很差,维护性差.如果中间 ...

  5. python 封装,隐藏属性,绑定方法classmethod和staticmethod

    [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内容都隐藏起 ...

  6. python基础之封装与绑定方法

    封装 1.什么是封装: 封:属性对外隐藏,但对内开放 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装: 封装数据属性:不让外部使用者直接使用数据,需要类内部开辟一个接口,让外部通过接 ...

  7. python基础18 ---多态与绑定方法

    一.抽象类 1.抽象类的定义:从一堆类中抽象出相同的内容,重新组成一个新的类,这样的类属于抽象类. 2.香蕉类是一类水果,苹果类是一类水果,葡萄类是一类水果,但是他们都属于水果,从他们这些类中可以抽象 ...

  8. python类中保存非绑定方法作为成员函数

    习惯了函数式,动不动传一个函数.但是直接把函数作为类方法保存,再调用时会报错. 举一个unittest时的例子 class MyTestCase(unittest.TestCase): @classm ...

  9. Python虚拟机类机制之绑定方法和非绑定方法(七)

    Bound Method和Unbound Method 在Python中,当对作为属性的函数进行引用时,会有两种形式,一种称为Bound Method,这种形式是通过类的实例对象进行属性引用,而另一种 ...

随机推荐

  1. 使用C#和MSMQ开发消息处理程序

    简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息, ...

  2. Tcp 编程 的时代 已经到来

    这是 一个 网友 在 Github 上的 项目  SmartRoute  : https://github.com/IKende/SmartRoute ZooKeeper 和 Consul 的 “投票 ...

  3. RequiresAuthentication

    @RequiresAuthentication 验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时. @RequiresUser 验证用户是否被记忆,us ...

  4. 一段简单的代码记录如何通过 js 给 HTML 设置自定义属性,并且通过点击事件获取到所设置的自定义属性值

    for (var i = 0; i <= 5; i++) { const divJoinDay = document.createElement("div"); divJoi ...

  5. java 使用POI读写Excel文件(兼容2003、2007)

    package com.jadyer.demo; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...

  6. Laravel日志查看器 -- log-viewer扩展

    1.修改laravel配置文件. config\app.php 'log'=>'daily' 2.在项目目录中composer命令安装扩展:composer require arcanedev/ ...

  7. JAVA课程设计——多源教学数据管理系统

    团队简介 团队名称: 419圣斗士 团队成员 姓名 成员介绍 任务分配 周炳辉(组长) 来自网络的一个大佬,穿女装很合适 poi与servlet 徐宏伟 网络中一个具有强大隐藏实力的大哥 css,部分 ...

  8. 【整理总结】代码沉淀 - CefSharp - 比较流行的第三方内嵌浏览器组件

    .NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework web: https://github.com/ce ...

  9. Mongodb 主从同步

    第一步:我们把mongodb部署多服务器上10.12.0.3和10.14.0.1. 第二步:启动10.12.0.3上的mongodb,把该数据库指定为主数据库 先启动主: mongod --port ...

  10. ExtJS自定义事件

    1.开发ExtJS组件UI的时候,基本上对于一些操作,就是与后台交互之类的多数都是用户进行点击触发一个事件,在事件的处理器handler里面调具体的业务方法,完成业务数据的处理以及业务流程的流转机制, ...