一句废话都没有的Pycharm(十二):类和对象

一句废话都没有的Pycharm(十二):类和对象

介绍:

  • 1.类和对象
    • 1.1 类的创建与组成
    • 1.2 对象的创建
    • 1.3 类属性和类方法的调用
    • 1.4动态绑定属性和方法
    • 1.5类的浅拷贝和深拷贝
  • 2.例子

1. 类和对象的创建

类是多个类似事物组成的群体;对象是相似的不同个体。
简单来说int类型的数据是一个;1,2,3,4,5是int类下包含的不同例,称为对象

在python当中一切皆对象。 其中对象由三部分组成:内存空间、类型和值。

1.1类的创建

语法:

class Member#Member是类的名称
      pass

类的名称可以由一个或多个单词组成。规范写法:每个单词首字母大写,其余小写。(不遵守程序也不会报错)

检查Member是否是对象,可以检查它是否有内存空间、类型和值。

#检查Student是否是对象
print(id(Member))#140279774567648
print(type(Member))#<class 'type'>
print(Member)#<class '__main__.Student'>
#因此Student是对象

结果:
在这里插入图片描述
类的组成:

骨骼图:
在这里插入图片描述

代码:

class Student:
    born_place='北京' #直接写在类里的变量,叫类属性
    #初始化
    def __init__(self,name,age):
        self.name=name#给实例属性赋值,self.name为实例属性
        self.age=age
    #实例方法:类里定义的def。 (类外定义的def称为函数)
    def inf(self):
        print('学生%s,%d岁。'%(self.name,self.age))#参考字符串那篇文章
    #类方法:用@classmethod修饰
    @classmethod
    def cl(cls):
        print('三年级学生!')
    #静态方法:用@staticmethod修饰
    @staticmethod
    def st():
        print('二班学生!')

1.2对象的创建
对象的创建又叫类的实例化。
语法:实例名=类名()
代码:

#创建Student类的对象
stu1=Student('王二',18)
#下面两种方式都可以
stu1.inf()#对象名.方法名()
Student.inf(stu1)#类名.方法名(类的对象)

结果:在这里插入图片描述
1.3类属性和类方法的调用方法

写在类中 方法外的变量称为类属性,被类中所有对象共享
代码:

#类属性的调用方法
stu2=Student('章三七',17)
print(stu1.born_place)#北京
print(stu2.born_place)#北京
Student.born_place='南京'#修改属性
print(stu1.born_place)#南京
print(stu2.born_place)#南京
#类方法的调用方法
Student.cl()
#静态方法的调用方法
Student.st()

结果:
在这里插入图片描述
1.4动态绑定属性和方法
python是动态语言,在创建对象后,可动态的绑定属性和方法。

一个类可以创建无数多个实例对象,这些对象的属性可以相同也可以不同。当我想给其中一个实例对象添加一个属性(其他实例对象不添加)时,就可以使用动态绑定。
添加方法:直接用对象名添加一个属性。stu1.sex='男'
动态绑定方法也是一样的,该方法只能被绑定的实例对象调用。
例如:

#动态绑定属性和方法
#动态绑定属性
stu1.sex='男'
print(stu1.name,stu1.age,stu1.sex)
#print(stu2.name,stu2.age,stu2.sex)#报错:'Student' object has no attribute 'sex'
print(stu2.name,stu2.age)
#动态绑定方法
def good_at():
    print(stu1.name+'擅长打篮球!')
stu1.good_at=good_at
stu1.good_at()

结果:
在这里插入图片描述
1.5类的浅拷贝和深拷贝
赋值: 两个变量,指向同一个对象。
浅拷贝: python一般拷贝都为浅拷贝,拷贝时,对象包涵的子对象内容不拷贝,因此,源对象和拷贝对象会引用同一个子对象。 通俗来讲就是,把包里的东西全拿出来放到另一个包里,包里的东西就是子对象,子对象不变。

代码:

#类的浅拷贝
class Book:
    pass
class Pens:
    pass
class Bag:
    def __init__(self,book,pens):
        self.book=book
        self.pens=pens
book1=Book()
pen1=Pens()
print(book1)
print(pen1)
bag1=Bag(book1,pen1)

import copy
bag2=copy.copy(bag1)
print(bag1,bag1.book,bag1.pens)
print(bag2,bag2.book,bag2.pens)

结果:
在这里插入图片描述

深拷贝: 使用copy模块中的deepcopy函数,递归拷贝对象中包含的子对象。源对象和拷贝对象的子对象不同。深拷贝可以理解为,我把包里东西再重新买了一遍,放到另一个包里,产品编号变了(ip变了),也就是说子对象变了。
例子:

#深拷贝
bag3=copy.deepcopy(bag1)
print(bag1,bag1.book,bag1.pens)
print(bag3,bag3.book,bag3.pens)

结果:
在这里插入图片描述
三个蓝色框框的IP都不一样。

2.例子
1.输出圆的周长和面积。

import math
class circle(object):
    def __init__(self,r):
        self.r=r
    def area(self):
        return math.pi*math.pow(self.r,2)
    def perimeter(self):
        return  2*self.r*math.pi
if __name__ == '__main__':
    r=int(input('请输入半径:'))
    p=circle(r)
    print(f'圆的面积为:{p.area()}')
    print(f'圆的周长为:{p.perimeter()}')
    #两位小数
    print('圆的面积为:{:.2f}'.format(p.area()))
    print('圆的周长为:{:.2f}'.format(p.perimeter()))

结果:
在这里插入图片描述
2.创建学生类

#创建学生类
class STUDENT(object):
    def __init__(self,s_name,s_age,s_sex,s_score):
        self.s_name=s_name
        self.s_age=s_age
        self.s_sex=s_sex
        self.s_score=s_score
    def show(self):
        print(self.s_name,self.s_age,self.s_sex,self.s_score)

if __name__ == '__main__':
    print('请输入3名学生信息:(格式为:姓名+年龄+性别+分数)')
    arrary=[]
    for i in range(0,3):
        a=input(f'请输入第{i+1}位学生的信息:')
        a_arr=a.split('+')
        #创建学生对象
        stu=STUDENT(a_arr[0],int(a_arr[1]),a_arr[2],float(a_arr[3]))
        arrary.append(stu)
    #遍历列表
    for item in arrary:
        item.show()

结果:
在这里插入图片描述
3.创建演奏类

class instrument(object):
    def make_sound(self):
        pass
class Paino(instrument):
    def make_sound(self):
        print('钢琴在演奏')
class Gita(instrument):
    def make_sound(self):
        print('吉他在演奏')
class Violin(instrument):
    def make_sound(self):
        print('小提琴在演奏!')
class bird():
    def make_sound(self):
        print('小鸟在唱歌!')
def play(instrument):
    instrument.make_sound()
if __name__ == '__main__':
    play(Paino())
    play(Violin())
    play(Gita())
    play(bird())

结果:
在这里插入图片描述
4.创建汽车的类

class Car(object):
    def __init__(self,name,no):
        self.name=name
        self.no=no
    def start(self):
        pass
    def stop(self):
        pass
class Taix(Car):
    def __init__(self,name,no,company):
        super().__init__(name,no)
        self.company=company
    def start(self):
            print(f'你好,我是{self.company}的{self.name},车牌号为{self.no},现在出发。')
    def stop(self):
            print('目的地已到达,欢迎下次乘坐!')
class Selfcar(Car):
    def __init__(self,name,no,where):
        super().__init__(name,no)
        self.where=where
    def start(self):
            print(f'我是{self.name},我的车牌号是{self.no},我要去{self.where}!')
    def stop(self):
            print('到达目的地了!')
if __name__ == '__main__':
    taix=Taix('安康','张强','沪D90008877')
    taix.start()
    taix.stop()
    print('----------------------------------------------')
    self=Selfcar('张强','沪T5667889','海南')
    self.start()
    self.stop()


结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值