文章目录

  • 1.属性查找顺序
    • 1.1.对象属性查找
    • 1.2类查找
  • 2.使用方法
    • 2.1对象使用
    • 2.2类使用方法
  • 3修改类的属性
    • 3.1类增查改删
    • 3.2在方法内修改类的属性
    • 3.4练习1
    • 3.5练习2
  • 4.绑定方法
    • 4.1绑定给对象
    • 4.2绑定给类
  • 5.类与类型的概念/一切皆对象
  • 6.非绑定方法(静态方法)
    • 6.1不带参数
    • 6.2带参数
  • 7.隐藏属性
    • 7.1目的
    • 7.2变形
    • 7.3在类中访问变形属性
    • 7.4不在类中定义
    • 7.5方法变形
    • 7.6使用场景
    • 7.7数据接口
    • 7.8函数接口
  • 8.property装饰器
    • 8.1使用
    • 8.2自动触发
      • 1.类属性
      • 2.对象属性
    • 8.3.另一种格式

1.属性查找顺序

1.1.对象属性查找

当对象创建独有的属性,与类中的属性一致.
属性的查找:先从自己的对象中查找,然后在去产生对象的类中取找.
class Student():school = 'x1'def __init__(self):pass# 对象查找
stu1 = Student()
stu2 = Student()
print(stu1.school)  # x1
print(stu2.school)  # x1# 对象查找
stu1.school = 'x2'
print(stu1.school)  # x2
print(stu2.school)  # x1

1.2类查找

在类中定义的属性是类属性.
类名.属性查看属性的值.
类无法查找到对象的属性.
class Student():# 定义一个属性school = 'x1'def __init__(self, name):self.name = namestu = Student('kid')
print(Student.school)  # x1

2.使用方法

2.1对象使用

类中定义的方法是为了给对象使用的,
对象调用方法会将自己作为第一个参数传递给方法.
(Python提供的快捷方式)
# 定义类
class Student:# 定义属性 同一个学校school = 'xxx'def __init__(self, name,  courses):self.name = nameself.courses = courses# 定义方法 选课def elective(self, courses):self.courses.append(courses)print('%s成功选择%s课程!' % (self.name, courses))  # kid成功选择python课程!# 实例化
stu1 = Student('kid', [])
stu1.elective('Python')

2.2类使用方法

类使用方法,不支持快捷方式,需要手动将对象作为第一个参数进行传递.
不推荐使用类去掉用方法.类中定义的方法是为了给对象使用的!
# 定义类
class Student:# 定义属性 同一个学校school = 'xxx'def __init__(self, name,  courses):self.name = nameself.courses = courses# 定义方法 选课def elective(self, courses):self.courses.append(courses)print('%s成功选择%s课程!' % (self.name, courses))  # kid成功选择python课程!# 类调用对象
stu2 = Student('qq', [])
Student.elective(stu2, 'Linux')

3修改类的属性

3.1类增查改删

# 定义类
class Student:# 定义属性 同一个学校school = 'x1'def __init__(self, name,  courses):self.name = nameself.courses = coursesprint(Student.school)  # 查Student.xx = 'x2'  # 增
print(Student.xx)  # x2 查Student.xx = 'x3'  # 改
print(Student.xx)  # x3 查del Student.xx
print(Student.__dict__)"""
{'__module__': '__main__', 'school': 'x1', '__init__': <function Student.__init__ at 0x00000218D0FBED08>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
"""

3.2在方法内修改类的属性

在对象中使用__class__的到类名,
类点属性得拿到值就可以进行修改.
# 定义类
class Student:# 定义属性 同一个学校school = 'x1'def __init__(self, name):self.__class__.school = nameprint(Student.__dict__)
stu1 = Student('x2')
print(Student.__dict__)
"""
'school': 'x1', ---
'school': 'x2', ---
"""

3.4练习1

题目:
1.定义一个类
2.产生一堆对象
3.统计生产多少个对象
# 定义类
class Count():num = 0def __init__(self):# 定义对象的属性self.__class__.num += 1# 实例化
s1 = Count()
s2 = Count()
s3 = Count()
s4 = Count()# 查看总数
print(Count.num)

3.5练习2

import random
import timeclass Skill():def __init__(self, a, q, w, e, r, hp):self.a = aself.q = qself.w = wself.e = eself.r = rself.hp = hp# 继承 a q w e r
class Galen(Skill):pass  # 被动技能# 继承 a q w e r
class RuiWen(Skill):pass  # 被动技能s1 = Galen(50, 100, 80, 400, 600, 1300)
s2 = RuiWen(60, 112, 50, 300, 650, 1250)# 打到血为0
while True:# 选技能print('德玛hp:%s      锐雯hp:%s' % (s1.hp, s2.hp))Galen_Skill_pool = [s1.a, s1.q, s1.w, s1.e, s1.r]Galen_Moves = random.choice(Galen_Skill_pool)Skill_pool = ['a', 'q', 'w', 'e', 'r']Skill_index = Galen_Skill_pool.index(Galen_Moves)print('盖伦使用 %s 技能 使瑞雯掉血 %s ' % (Skill_pool[Skill_index], Galen_Moves))s2.hp -= Galen_Movesprint('德玛hp:%s      锐雯hp:%s' % (s1.hp, s2.hp))RuiWen_Skill_pool = [s2.a, s2.q, s2.w, s2.e, s2.r]RuiWen_Moves = random.choice(RuiWen_Skill_pool)Skill_index = Galen_Skill_pool.index(Galen_Moves)print('瑞雯使用 %s 技能 使盖伦掉血 %s ' % (Skill_pool[Skill_index], RuiWen_Moves))s1.hp -= RuiWen_Movestime.sleep(1)if s1.hp < 0 or s2.hp < 0:print('德玛hp:%s      锐雯hp:%s' % (s1.hp, s2.hp))if s1.hp < 0:print('德玛死了')else:print('锐雯死了')break

4.绑定方法

绑定方法: 绑定给谁就是将谁作为第一个参数传给方法.

4.1绑定给对象

将对象作为第一个参数,传递给方法.方法是为对象提供的,默认就是绑定给对象.对象能直接使用.的方式来调用方法.类使用方法不提供自动将对象作为第一个参数,传递给方法.需要手动正常的传入值。
class Mysql():country = 'xxx'# 初始化def __init__(self, ip, port):self.ip = ipself.port = portdef tell_info(self):print('%s : %s' % (self.ip, self.port))# 实例化
obj1 = Mysql('127.0.0.1', 80)
obj1.tell_info()  # 对象直接调用功能属性, 将自己作为第一个参数进行传递
print(obj1.country)  # 对象直接调用数据属性# 实例化
obj2 = Mysql('127.0.0.1', 80)
obj2.tell_info()  # 对象直接调用功能属性, 将自己作为第一个参数进行传递
print(obj2.country)  # 对象直接调用数据属性

4.2绑定给类

为什么要绑定给类?
上面的代码如果需要产生多个对象,而参数又是一样的,且不会变的.
则可以将相同的参数写进配置文件中.在使用类绑定方法的方式,自定传递参数.
类作为参数传递时,方法中使用cls做为参数名.
# 不创两个文件了---
IP = '127.0.0.1'
PORT = 81# 定义类
class Mysql():# 初始化def __init__(self, ip, port):self.ip = ipself.port = port#  @classmethod 装饰器 将方法绑定给类@classmethoddef config(cls):obj = cls(IP, PORT)return obj# 类调用方法
obj = Mysql.config()
print(obj.ip)

5.类与类型的概念/一切皆对象

类与类型的概念
Python3中统一了类与类型的概念。
l = [1, 2, 3]   等同  l =  list(1, 2 ,3)
print(type(l))
<clsaa 'list'>l1 .append(4)  --->   将l1传入append() 中
对象调用方法将自己作为第一个参数传递。list是类,类调用方法,方法绑定给类
l = [1, 2, 3]
list.append(l, 4)
print(l)  [1, 2, 3, 4]print(isinstance(l1, list))  # True 判断某个值是否由某个类创建class AAA():passaaa = AAA()print(isinstance(aaa, AAA))  # True 判断某个值是否由某个类创建Python中所有的数据都是通过调用类实例化得来.
一切皆对象

6.非绑定方法(静态方法)

非绑定方法:不绑定对象也不绑定类.定义在类中,调用时传递对象和类名,
其他的参数该怎么传入就怎么传入.@staticmethod  # 静态方法语法糖

6.1不带参数

# 既不绑定给类,也不绑定给对象,谁都可以调用,不要要传值
class Mysql():pass@staticmethoddef create_id():  """添加装饰器后 self 删除不需要参数"""import uuid  print(uuid.uuid4())# 对象调用方法
obj = Mysql()
obj.create_id()  # 类调用方法
Mysql().create_id()

6.2带参数

需要参数就正常传递.
class Mysql():pass@staticmethod  # 函数的其他参数需要正常传入def create_id(x):import uuidprint(x)print(uuid.uuid4())# 对象调用
obj = Mysql()
obj.create_id(1)# 类调用
Mysql.create_id(1)

7.隐藏属性

7.1目的

隐藏属性的目的:隐藏属性,不让外界直接使用.
分两步实现,隐藏与开放接口。
(对数据的增删改查封装成一个个接口,在接口中设置限制.)

7.2变形

在名称的前面加上__,对名称做变形处理,只在定义阶段做变形.
__名称 变形 -->  _类名__名称
1.定义阶段,只是语法上的变形,还有可以按_类名__名称的方式取值.
2.隐藏只对外不对内,如果在返回类中的属性,在类中设置对外的接口.
3.变形操作只在定义阶段,之后所有属性都不会变形.
class Test():__name = 10print(Test.__name)"""AttributeError: type object 'Test' has no attribute '__name'属性错误: 类型对象“Test”没有属性“__name”
"""
class Test():__name = 10print(Test.__dict__)"""'_Test__name': 10,
"""

7.3在类中访问变形属性

在定义阶段两个__name都会变形为_Test__name' 所有能访问得到.
class Test():__name = 10@classmethoddef get_name(cls):return cls.__nameprint(Test.get_name())

7.4不在类中定义

不在类中定义,__不会有隐藏功能
class Test():passs1 = Test()
s1.__name = 'kid'print(s1.__dict__)  # {'__name': 'kid'}

7.5方法变形

方式名同样可以使用__进行变形.
class Test():def __index(self):print('hello word!')def get_index(self):return self.__class__.__index(self)s1 = Test()
s1.get_index()  # hello word!

7.6使用场景

对数据进行变形处理,隐藏访问,做一个对外开发的接口,
在接口函数中限制数据值的增删改查操作.
class Test():__name = 0def set_num(self, x):if isinstance(x, int):self.__class__.__name = xreturn self.__class__.__namereturn '输入不是int类型数据!'s1 = Test()
print(s1.set_num(1))"""
输入1   显示 1
输入'o' 显示 不是int类型数据!
"""

7.7数据接口

class Student:def __init__(self, name, age):set_info(self, name, age)def set_info(self, name, age):if type(name) != str:return print('名字必须是字符串!')if type(age) != int:return print('名字必须是数字!')self.__name = nameself.__age = agestu1 = Student('kid', 18)
stu1.set_info(1, 19)            # 名字必须是字符串!
stu1.set_info('kid', '18')      # 名字必须是数字!
stu1实例化后,stu1调用函数et_info()修改定制了限制。
class Student:def set_info(self, name, age):if type(name) != str:return print('名字必须是字符串!')if type(age) != int:return print('名字必须是数字!')self.__name = nameself.__age = agedef __init__(self, name, age):self.set_info(name, age)    stu1 = Student('kid', 18)

7.8函数接口

将功能都隐藏,只开放接口,通过接口调用功能。
class ATM:def __card(self):            # 插入银行卡print('插入银行卡')def __auth(self):            # 验证密码print('用户认证成功')def __input(self):           # 输入金额print('取款金额')def __print_bill(self):      # 打印小票print('打印票据')def __take_money(self):      # 取钱print('取款')def withdraw(self):          # ATM功能self.__card()self.__auth()self.__input()self.__print_bill()self.__take_money()obj=ATM()
obj.withdraw()                  # 调用接口操作每个功能

8.property装饰器

property装饰器将一个方法伪装成一个属性,
看起来像是在使用方法,其实是在使用方法.
有两个额外的装饰器搭配一起使用.
格式:
@property
def 函数():pass
@函数名.setter  修改值时自动触发
@函数名.deleter 删除值时自动触发

8.1使用

property装饰器配送隐藏属性一起使用.
将真正的属于进行变形处理到达隐藏的效果.
定义一个接口函数,这个函数的名字要是没隐藏前的属性名.
class Test():# 真正的name变形__name = 0# 使用property 假装成name@propertydef name(self):return self.__class__.__names1 = Test()
print(s1.name)  # 0

8.2自动触发

@函数名.setter  修改值时自动触发
@函数名.deleter 删除值时自动触发
1.类属性
class Test():# 真正的name变形__name = 0# 使用property 假装成name@propertydef name(self):return self.__class__.__name@name.setterdef name(self, x):# 限制if isinstance(x, int):self.__class__.__name = xelse:print('输入不是int类型')@name.deleterdef name(self):print('不能删除!')s1 = Test()
print(s1.name)  # 查看值s1.name = 12  # 修改值
print(s1.name)  # 查看值del s1.name  # 删除
2.对象属性
class Test():def __init__(self, name):self.__name = name# 使用property 假装成name@propertydef name(self):return self.__name@name.setterdef name(self, x):# 限制if isinstance(x, str):self.__name = xelse:print('输入字符串')@name.deleterdef name(self):print('不能删除!')s1 = Test('kid')
print(s1.name)  # 查看值s1.name = 'qz'  # 修改值
print(s1.name)  # 查看值del s1.name  # 删除"""
kid
qz
不能删除!
"""

8.3.另一种格式

按 伪装属性 修改属性 删除属性 排序
名字 = property(get_name, set_name, del_name)
class Test():def __init__(self, name):self.__name = namedef get_name(self):return self.__namedef set_name(self, x):# 限制if isinstance(x, str):self.__name = xelse:print('输入字符串')def del_name(self):print('不能删除!')name = property(get_name, set_name, del_name)s1 = Test('kid')
print(s1.name)  # 查看值s1.name = 'qz'  # 修改值
print(s1.name)  # 查看值del s1.name  # 删除"""
kid
qz
不能删除!
"""

37.对象属性查找绑定方法相关推荐

  1. java 反射 设置属性_Java通过反射机制动态设置对象属性值的方法

    /** * MethodName: getReflection * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7- ...

  2. Map转对象属性值组装方法

    Map转对象属性值组装方法 public class GetFields {public static void main(String[] args) throws Exception {Merch ...

  3. Python OOP:面向对象基础,定义类,创建对象/实例,self,创建多个对象,添加对象属性,访问对象属性,__init__方法,带参数的__init__,__str__方法,__del__方法

    一.理解面向对象 面向对象是⼀种抽象化的编程思想,很多编程语⾔中都有的⼀种思想. ⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使用的,不用去管他内部的情况.⽽编程就是设置事物能够做什么事. ...

  4. Python中面向对象self获取对象属性,魔法方法

    类和对象 类(Class) 由3个部分构成 01). 类的名称:类名 02). 类的属性:一组数据 03). 类的方法:允许对进行操作的方法 (行为) 定义类 object 是Python 里所有类的 ...

  5. java获取实体类对象_java 获取实体类对象属性值的方法

    在java中我们要获得实体类对象的属性,一般情况是将实体类中的属性私有化,然后再对外提供get()与set()方法,然后再获取实体类对象的属性的时候先把对象new出来,再用变量名.get()的方法得到 ...

  6. Mockito 中被 Mocked 的对象属性及方法的默认值

    在 Java 测试中使用 Mockito 有段时日了,以前只是想当然的认为 Mock 的对象属性值和方法返回值都是依据同样的规则.基本类型是 0, 0.0, 或 false, 对象类型都是 null, ...

  7. 在 JavaScript 中访问对象属性的 3 种方法

    您可以通过 3 种方式访问 JavaScript 中对象的属性: 点属性访问器:object.property 方括号属性访问:object['property'] 对象解构:const { prop ...

  8. JS 对象属性的两种表示方法

    JS中对象属性的表示方法有两种: <prop为属性名> obj.prop obj['prop'](注:'[]'里面必须是字符串) 例: var obj = {name:'abc' } ob ...

  9. python getattrribute_python操作对象属性

    getattr getattr(a,'b')的作用就和a.b是一样的.那么这个内建函数有什么作用呢,最方便的无疑是使用它来实现工厂方法(Factory Method)模式. 参数说明: object: ...

最新文章

  1. 首发 | 13篇京东CVPR 2019论文!你值得一读~ 技术头条
  2. 如何理解Memory leak
  3. Nature:人体菌群研究的25个里程碑
  4. 服务器发消息给所有人,我需要服务器向所有客户端(Python、sockets)发送消息...
  5. linux安装部署apache+subversion+jsvnadmin
  6. shell命令之---sed
  7. Oracle中备用查询语句
  8. Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库(最强输出速度,单机数据库3000W数据写入最多180秒)
  9. 如何将文件PDF格式转换成Word格式
  10. Android键盘删除键问题
  11. c语言如何画函数图形,c语言绘制函数曲线
  12. 局域网IP和外网(广域网)IP(又称公有IP和私有IP)
  13. jqGrid 学习笔记整理——进阶篇(一 )
  14. 计算机科学与技术专业师范与非师范,同一个专业,师范和非师范到底有啥区别?...
  15. 单元格下拉全选快捷键_【excel下拉全选快捷键】Excel中全选是Ctrl A,那么反选呢?...
  16. Java 定时任务详解
  17. 运维面临的主要安全威胁介绍
  18. 什么是 fail-fast 机制?
  19. 一周企业财报 | 安踏、易车、药明康德、贝塔斯曼等23家企业发布业绩
  20. android oreo小米,小米修复了Mi A1的Android Oreo OTA 并修复了一些错误

热门文章

  1. java基础Review One
  2. 笔记本厂商蓄意缩短使用寿命?
  3. IndexOf判断字符串是否存在
  4. 计算机教育专业委员会开会,2017全国高校计算机教育大会在并召开
  5. 圣诞节活动微信排版?我教你啊!
  6. 5种方法让你不再睡过闹钟
  7. java个人通讯录系统_JSP个人通讯录系统
  8. 向添加前端静态页面之后,菜单栏显示正常,但是点击的时候报错main.js:978 Error: Cannot find module ‘./function (resolve) {。。。。。。
  9. 魔法堂:NPM入了个门
  10. 安徽大学软件构造(设计模式)实验集