在类中定义的名字,都是类的属性,细说的话,类有两种属性:数据属性和函数属性,可以通过__dict__查看属性的值
class Demo(object):
'''定义类属性'''
name = 'lucky'
age = 18
def school(self):
print('清华大学')
d1 = Demo()
- 可以通过类调用
d1 = Demo()
# 通过对象调用
## 类中定义的属性 所有实例化的对象都拥有
print(d1.name) # lucky
d1.school() # 清华大学
d2 = Demo()
print(d2.name) # lucky
d2.school() # 清华大学
- 可以通过对象调用
## 通过类调用
print(Demo.name)# lucky
Demo.school() # 清华大学
类名.属性名 = 属性值
# 绑定类属性
Demo.sex = 'man'
print(d1.sex) # man
print(d2.sex) # man
- hasattr() 判断是否有该属性
- setattr() 设置属性
- getattr() 获取属性值
print(getattr(Demo, 'name'))
setattr(Demo, 'sex', 'man')
print(hasattr(Demo, 'name'))
print(hasattr(Demo, 'namee'))
通过实例化对象或self对象创建的属性,称为对象属性。对象属性只能存在于当前对象中,对象属性只能由对象调用。
注意
- 使用对象创建的属性,只有当前对象拥有,和别的对象没有关系
- 使用类创建的属性,所有对象都拥有
- 在对象中修改类中的属性,实则为创建了新的和类中同名的对象属性,当调用的时候,优先调用对象属性,如果对象中不存在,则去类中查找该属性;如果类中不存在,则抛出属性错误的异常。
- 类中self所创建的属性也为对象属性,哪个对象调用的,则该属性属于哪个对象的。
- 对象对类中的所有属性和方法只有使用权,没有操作权。
- 类可以修改删除自己类中的属性和方法
- 类实例化的对象创建
- 通过类的内部的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)
- 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)
- 直接给对象赋值函数
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()
注意:对象绑定属性或方法、都只存在于当前的对象中 和其它对象无关
给类绑定属性和方法 所有对象都存在该属性和方法
- 直接赋值
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())