python空类和实例属性赋值

1 python空类和实例属性赋值

1.1 空类

python类主体没有任何内容,只有pass语句,称为空类。

1.2 obj.attr属性赋值

通过obj.attr=value进行类和实例属性赋值。

NO场景描述
1类添加属性(1) 类添加属性,用于记录数据。
(2) 实例没属性,实例取类属性。
2实例修改属性(1) 实例修改类不可变属性,相互间不影响。
(2) 实例修改类可变属性,指向同一值,相互影响。
3实例新增属性(1) 实例新增属性,只属于本实例。
(2) 实例新增属性,用于记录数据,一个实例相当于一条记录。

综上,

类添加属性,用于各个实例共享,通常添加实例共有属性,非个性化属性。

实例添加属性,用于记录不同属性。

文件

E:\documents\F盘\testclass.py

class Record:pass

if __name__ == '__main__':
    # 添加类属性(数据属性)
    Record.name = '梯阅线条'
    Record.age = '18'
    print('Record.姓名:{},年龄:{}'.format(Record.name,Record.age))
    
    # 实例共享类属性
    r1 = Record()
    r2 = Record()
    print('r1.姓名:{},年龄:{}'.format(r1.name,r1.age))
    print('r2.姓名:{},年龄:{}'.format(r2.name,r2.age))
    
    # 修改实例属性,只影响实例本身,根据属性搜索树优先读取实例属性
    r1.name = 'r1.name'
    r1.age = 'r1.age'
    
    r2.name = 'r2.name'
    r2.age = 'r2.age'
    
    print('Record.姓名:{},年龄:{}'.format(Record.name,Record.age))
    print('r1.姓名:{},年龄:{}'.format(r1.name,r1.age))
    print('r2.姓名:{},年龄:{}'.format(r2.name,r2.age))
    
    # 实例新增属性只属于当前实例
    r1.sex = '男'
    r2.sex = '女'
    try:
        print('Record.姓名:{},年龄:{},性别:{}'.format(Record.name,Record.age,Record.sex))
    except Exception as e:
        print('Record.姓名:Record.name,年龄:Record.age,性别:Record.sex.=>{}'.format(e))
    print('r1.姓名:{},年龄:{},性别:{}'.format(r1.name,r1.age,r1.sex))
    print('r2.姓名:{},年龄:{},性别:{}'.format(r2.name,r2.age,r2.sex))

示例

# 打开cmd,执行下面示例
E:\documents\F盘>python testclass.py
Record.姓名:梯阅线条,年龄:18
r1.姓名:梯阅线条,年龄:18
r2.姓名:梯阅线条,年龄:18
Record.姓名:梯阅线条,年龄:18
r1.姓名:r1.name,年龄:r1.age
r2.姓名:r2.name,年龄:r2.age
Record.姓名:Record.name,年龄:Record.age,性别:Record.sex.=>type object 'Record' has no attribute 'sex'
r1.姓名:r1.name,年龄:r1.age,性别:男
r2.姓名:r2.name,年龄:r2.age,性别:

1.3 类属性-dict,class,bases

NO属性描述
1dict类和实例的属性字典。 实例无本身属性则为空。
2class查看实例所属类。
3bases查看指定类名的直接超类元组。 实例对象没有__bases__属性。

文件

E:\documents\F盘\testclass.py

class Record:pass

class MyRecordA(Record):
    pass
    
class MyRecordB(MyRecordA):
    pass
    
class MyRecordC(MyRecordB,MyRecordA):
    pass

if __name__ == '__main__':
    Record.name = '梯阅线条'
    Record.age = '18'

    r1 = Record()
    r2 = Record()
    r1.name = 'r1.name'
    r1.age = 'r1.age'
    r1.sex = 'r1.sex'
    
    # __dict__ 属性字典
    print('Record.__dict__.keys()={}'.format(list(Record.__dict__.keys())))
    # r1赋值实例,属性字典非空
    print('r1.__dict__.keys()={}'.format(list(r1.__dict__.keys())))
    # r2 空实例,属性字典为空
    print('r2.__dict__.keys()={}'.format(list(r2.__dict__.keys())))
    
    # __class__ 查看实例所属类
    print('Record.__class__={}'.format(Record.__class__))
    print('r1.__class__={}'.format(r1.__class__))
    
    # __bases__ 查看指定类名的直接超类元组
    print('Record.__bases__={}'.format(Record.__bases__))
    print('MyRecordA.__bases__={}'.format(MyRecordA.__bases__))
    # MyRecordB 的 直接超类为 MyRecordA,不包括 Record
    print('MyRecordB.__bases__={}'.format(MyRecordB.__bases__))
    print('MyRecordC.__bases__={}'.format(MyRecordC.__bases__))
    try:
        print('r1.__bases__={}'.format(r1.__bases__))
    except Exception as e:
        # 实例对象没有 __bases__ 属性
        print('r1.__bases__={}'.format(e))

示例

# 打开cmd,执行下面示例
E:\documents\F盘>python testclass.py
Record.__dict__.keys()=['__module__', '__dict__', '__weakref__', '__doc__', 'name', 'age']
r1.__dict__.keys()=['name', 'age', 'sex']
r2.__dict__.keys()=[]
Record.__class__=<class 'type'>
r1.__class__=<class '__main__.Record'>
Record.__bases__=(<class 'object'>,)
MyRecordA.__bases__=(<class '__main__.Record'>,)
MyRecordB.__bases__=(<class '__main__.MyRecordA'>,)
MyRecordC.__bases__=(<class '__main__.MyRecordB'>, <class '__main__.MyRecordA'>)
r1.__bases__='Record' object has no attribute '__bases__'

1.4 类外定义方法

可以在class外定义方法,然后给类或实例调用。

文件

E**:\documents\F盘\testclass.**py

class Record:pass

# 类外定义方法
def printRecord(self):
    print('self.姓名:{},年龄:{}'.format(self.name,self.age))

if __name__ == '__main__':
    Record.name = '梯阅线条'
    Record.age = '18'

    r1 = Record()
    r2 = Record()
    r1.name = 'r1.name'
    r1.age = 'r1.age'
    
    # 普通函数使用
    printRecord(Record)
    printRecord(r1)
    printRecord(r2)
    
    # 赋值给类进行使用
    Record.printRec = printRecord
    Record.printRec(Record)
    r1.printRec()
    r2.printRec()

示例

# 打开cmd,执行下面示例
E:\documents\F盘>python testclass.py
self.姓名:梯阅线条,年龄:18
self.姓名:r1.name,年龄:r1.age
self.姓名:梯阅线条,年龄:18
self.姓名:梯阅线条,年龄:18
self.姓名:r1.name,年龄:r1.age
self.姓名:梯阅线条,年龄:18
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值