2024.01.16

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def show(self):
        print(f'大家好,我叫:{self.name},我今年:{self.age}岁')


#创建Person类对象
per=Person('陈梅',23)
print(dir(per))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'show']
#最后面几个是自己定义的,前面那些是从object父类继承来的

P119特殊方法(很多运算符号可以用其他方法等效代替,比如加法就是__add__)

P120特殊属性(首位双下划线的方法称为特殊方法,首尾双下划线的属性就是特殊属性)

class A:
    pass
class B:
    pass

class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age = age

#创建类的对象
a=A()
b=B()
#创建C类对象
c=C

print('对象a的属性字典:',a.__dict__)#对象的属性字典
print('对象b的属性字典:',b.__dict__)
print('对象c的属性字典:',c.__dict__)
# 对象a的属性字典: {}
# 对象b的属性字典: {}
# 对象c的属性字典: {'__module__': '__main__', '__init__': <function C.__init__ at 0x00000244391DEF28>, '__doc__': None}

print('对象a所属的类:',a.__class__)
print('对象b所属的类:',b.__class__)
print('对象c所属的类:',c.__class__)

print('对象A的父类元组:',A.__bases__)
print('对象B的父类元组:',B.__bases__)
print('对象C的父类元组:',C.__bases__)
# 对象a所属的类: <class '__main__.A'>
# 对象b所属的类: <class '__main__.B'>
# 对象c所属的类: <class 'type'>
# 对象A的父类元组: (<class 'object'>,)
# 对象B的父类元组: (<class 'object'>,)
# 对象C的父类元组: (<class '__main__.A'>, <class '__main__.B'>)
print('对象A的父类:',A.__base__)
print('对象B的父类:',B.__base__)
print('对象C的父类:',C.__base__)
# 对象A的父类: <class 'object'>
# 对象B的父类: <class 'object'>
# 对象C的父类: <class '__main__.A'>   (C有多个父类,这里只显示第一个父类)
print('A的层次结构:',A.__mro__)
print('B的层次结构:',B.__mro__)
print('C的层次结构:',C.__mro__)
# A的层次结构: (<class '__main__.A'>, <class 'object'>)
# B的层次结构: (<class '__main__.B'>, <class 'object'>)
# C的层次结构: (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
print('A的子类列表:',A.__subclasses__())
print('B的子类列表:',B.__subclasses__())
print('C的子类列表:',C.__subclasses__())
# A的子类列表: [<class '__main__.C'>]
# B的子类列表: [<class '__main__.C'>]
# C的子类列表: []

P121类的深拷贝与浅拷贝

class CPU():
    pass
class Disk():
    pass

class Computer():
    #计算机由CPU和硬盘组成
    def __init__(self,cpu,disk):#此处是两个形式参数
        self.cpu=cpu#给实例属性赋值
        self.disk = disk

cpu=CPU()#创建对象
disk=Disk()

com=Computer(cpu,disk)
#变量(对象)的赋值
com1=com
print(com,'子对象的内存地址',com.cpu,com.disk)
print(com1,'子对象的内存地址',com1.cpu,com1.disk)
# <__main__.Computer object at 0x0000020CB623D2E8> 子对象的内存地址 <__main__.CPU object at 0x0000020CB607A550> <__main__.Disk object at 0x0000020CB6237518>
# <__main__.Computer object at 0x0000020CB623D2E8> 子对象的内存地址 <__main__.CPU object at 0x0000020CB607A550> <__main__.Disk object at 0x0000020CB6237518>

#类对象的浅拷贝
import copy#导入copy模块
com2=copy.copy(com)#com2是新产生的对象,com2的子对象,cpu,disk不变
print(com,'子对象的内存地址',com.cpu,com.disk)
print(com2,'子对象的内存地址',com2.cpu,com2.disk)
# <__main__.Computer object at 0x000001AE198AD2E8> 子对象的内存地址 <__main__.CPU object at 0x000001AE196EA588> <__main__.Disk object at 0x000001AE196EAF28>
# <__main__.Computer object at 0x000001AE198AD320> 子对象的内存地址 <__main__.CPU object at 0x000001AE196EA588> <__main__.Disk object at 0x000001AE196EAF28>
#子对象不变,子对象的硬盘不变

#类对象的深拷贝
com3=copy.deepcopy(com)
print(com,'子对象的内存地址',com.cpu,com.disk)
print(com3,'子对象的内存地址',com3.cpu,com3.disk)
# <__main__.Computer object at 0x000001F3B499D320> 子对象的内存地址 <__main__.CPU object at 0x000001F3B47DA550> <__main__.Disk object at 0x000001F3B49975C0>
# <__main__.Computer object at 0x000001F3B499D438> 子对象的内存地址 <__main__.CPU object at 0x000001F3B499D780> <__main__.Disk object at 0x000001F3B499D860>

P122本章总结

用面向对象的思想计算圆的面积与周长

class Circle:
    def __init__(self,r):
        self.r=r

    #计算面积的方法
    def get_area(self):
        #return 3.14*self.r*self.r
        return 3.14*pow(self.r,2)

    #计算周长的方法
    def get_perimeter(self):
        return 2*3.14*self.r

#创建对象
r=eval(input('请输入圆的半径:'))
c=Circle(r)
#调用方法
area=c.get_area()#调用面积的方法
perimeter=c.get_perimeter()
print("圆的面积为",area)
print('圆的周长为',perimeter)

# 请输入圆的半径:2
# 圆的面积为 12.56
# 圆的周长为 12.56
#一些缩进存在问题,导致运行不了。。。。要注意

P125定义学生类,录入五个学生信息,把他们存储到列表中

class Student:
    def __init__(self,name,age,gender,score):
        self.name=name
        self.age=age
        self.gender=gender
        self.score=score

    def info(self):
        print(self.name,self.age,self.gender,self.score)

print('请输入5位学生信息:(姓名#年龄#性别#成绩)')
lst=[]#用于储存5个学生对象
for i in range(1,6):
    s=input(f'请输入第{i}位学生信息及成绩:')
    s_lst=s.split('#')
    stu=Student(s_lst[0],s_lst[1],s_lst[2],s_lst[3])
    #讲学生对象添加到列表中
    lst.append(stu)
#遍历列表,调用学生对象的info方法
for item in lst:
    item.info()
# 请输入5位学生信息:(姓名#年龄#性别#成绩)
# 请输入第1位学生信息及成绩:张三#20#男#30
# 请输入第2位学生信息及成绩:李四#20#男#40
# 请输入第3位学生信息及成绩:王五#20#男#70
# 请输入第4位学生信息及成绩:赵六#20#女#80
# 请输入第5位学生信息及成绩:小二#20#男#100
# 张三 20 男 30
# 李四 20 男 40
# 王五 20 男 70
# 赵六 20 女 80
# 小二 20 男 100

#经常吧init打成int导致代码运行错误,这里要注意

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值