一句废话都没有的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()
结果: