Skip to content

Latest commit

 

History

History
267 lines (191 loc) · 5.79 KB

File metadata and controls

267 lines (191 loc) · 5.79 KB

属性访问

1、类属性

在类中定义的名字,都是类的属性,细说的话,类有两种属性:数据属性和函数属性,可以通过__dict__查看属性的值

1.1、定义

class Demo(object):
    '''定义类属性'''
    name = 'lucky'
    age = 18
    
    def school(self):
        print('清华大学')
d1 = Demo()

1.2、调用

  • 可以通过类调用
d1 = Demo()

# 通过对象调用
## 类中定义的属性  所有实例化的对象都拥有
print(d1.name)  # lucky
d1.school()		# 清华大学
d2 = Demo()     
print(d2.name)	# lucky
d2.school()		# 清华大学
  • 可以通过对象调用
## 通过类调用
print(Demo.name)# lucky
Demo.school()	# 清华大学

1.3、给类绑定属性(增加类属性)

类名.属性名 = 属性值

# 绑定类属性

Demo.sex = 'man'
print(d1.sex) # man
print(d2.sex) # man

1.4、类对属性的操作

  • hasattr() 判断是否有该属性
  • setattr() 设置属性
  • getattr() 获取属性值
print(getattr(Demo, 'name'))
setattr(Demo, 'sex', 'man')
print(hasattr(Demo, 'name'))
print(hasattr(Demo, 'namee'))

二、对象属性

通过实例化对象或self对象创建的属性,称为对象属性。对象属性只能存在于当前对象中,对象属性只能由对象调用。

注意

  • 使用对象创建的属性,只有当前对象拥有,和别的对象没有关系
  • 使用类创建的属性,所有对象都拥有
  • 在对象中修改类中的属性,实则为创建了新的和类中同名的对象属性,当调用的时候,优先调用对象属性,如果对象中不存在,则去类中查找该属性;如果类中不存在,则抛出属性错误的异常。
  • 类中self所创建的属性也为对象属性,哪个对象调用的,则该属性属于哪个对象的。
  • 对象对类中的所有属性和方法只有使用权,没有操作权。
  • 类可以修改删除自己类中的属性和方法

2.1、创建对象属性

  • 类实例化的对象创建
  • 通过类的内部的self进行创建
class Demo:
    name = 'lucky'

    # 类中创建对象属性的方法
    def create_attr(self, attr, value):
        # 属性不能传递变量 否则属性名为 当前的变量名
        print(attr, value)
        self.attr = value
        print(self.__dict__)

d1 = Demo()

# 创建对象属性sex
d1.sex = 'man'

# 通过对象属性调用的
print(d1.sex) # man

# 报错  类不能调用对象属性
print(Demo.sex)  

d1.create_attr('age', 18)
print(d1.attr)

2.2、类/对象操作属性或方法

  • hasattr() 判断是否有该属性
  • getattr() 获取该属性值
  • setattr() 设置属性值
print(getattr(d1, 'name'))
print(setattr(d1, 'name', 'zhangsan'))
print(d1.name)
print(hasattr(d1, 'name'))
print(hasattr(d1, 'namee'))

小实例

import time
class ATM:
    # 默认ATM中金额为0元
    money = 0
    # 操作的用户
    user = ''

    # 存款
    def set_money(self):
        # 获取用户输入的金额
        # 金额的异常处理   判断存款金额
        money = eval(input('请输入存款金额:'))
        # 更改money金额
        self.money += money
        print('恭喜:{} 存款成功 存款金额为:{} 卡内余额为:{}'.format(self.user, money, self.money))
    # 取款
    def get_money(self):
        # 取款金额和卡内余额的关系
        # 判断当前用户取款金额 是否为 整数的金额 100、200、300
        money = eval(input('请输入要取款的金额'))
        if self.money < money:
            print('抱歉 您卡内余额不足~')
            return
        # 余额的处理
        self.money -= money
        print('恭喜:{} 取款成功!取款金额为:{} 卡内可用余额为:{}'.format(self.user, money, self.money))


    # 查看金额
    def look_money(self):
        print('欢迎:{} 您卡内余额为:{}'.format(self.user, self.money))


user = ATM()

# 欢迎...来办理业务
if __name__ == '__main__':
    print('******************************')
    print('******************************')
    print('*****欢迎来到ATM自助取款机*****')
    print('******************************')
    print('******************************')
    # 输入用户姓名
    user.user = input('请输入当前客户姓名:')
    while True:
        print('**********1    存款********************')
        print('**********2    取款********************')
        print('**********3    查看余额****************')
        choose = eval(input('请输入你要办理的业务'))
        if choose == 1:
            user.set_money()
        elif choose == 2:
            user.get_money()
        elif choose == 3:
            user.look_money()
        else:
            print('抱歉、请重新输入')
        time.sleep(2)

三、对象与类绑定方法

3.1、对象绑定方法

  • 直接给对象赋值函数
class Test:
    name = 'lucky'

t1 = Test()

def run(self):
    print(self.name)
    print('大伟 is running')

# run属性存储为 run函数体
t1.run = run
t1.run(t1)
  • 使用MethodType进行绑定
from types import MethodType

# 使用MethodType去绑定对象方法
t1.run = MethodType(run, t1)
t1.run()

注意:对象绑定属性或方法、都只存在于当前的对象中 和其它对象无关

3.2、类绑定方法

给类绑定属性和方法 所有对象都存在该属性和方法

  • 直接赋值
class Test:
    pass
    
t1 = Test()

def run(self):
    print(self)
    print('大伟 is running...')

# 直接赋值法
Test.run = run
t1.run()
  • 使用MethodType进行绑定
# 使用MethodType进行绑定
Test.run = MethodType(run, Test)

print(t1.run())