在哔哩哔哩上学习python时,根据视频老师的讲解与自己学习的进度,记录了学习时的代码,当对于类与对象这部分有什么不清楚的理解理解就可以直接使用喔~^_^~~~
目录
1.创建类
- demo1: 基本认识
class Student: # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
pass
# Python 中一切皆对象 Student是对象吗?内存有空间吗?
print(id(Student))
print(type(Student))
print(Student)
- demo2:类的详细介绍(实例)
class Student: # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
native_place = '河南' # 直接写在类里的变量,成为类属性
def __init__(self, name, age): # 初始化方法
self.name = name # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
self.age = age
# 实例方法
def eat(self):
print('学生在吃饭...')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我是类方法,因为我使用了classmethod进行修饰')
# 在类之外定义的称为函数,在类之内的称为方法
def drink():
print('喝水')
2.创建类对象
demo3:在demo2的基础上创建类对象
class Student: # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
native_place = '河南' # 直接写在类里的变量,成为类属性
def __init__(self, name, age): # 初始化方法
self.name = name # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
self.age = age
# 实例方法
def eat(self):
print('学生在吃饭...')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我是类方法,因为我使用了classmethod进行修饰')
# 在类之外定义的称为函数,在类之内的称为方法
def drink():
print('喝水')
# 创建Student类的对象
stu1 = Student('张三', 20) # stu1 称为实例对象
print(id(stu1))
print(type(stu1))
print(stu1)
print('-----------------------')
print(id(Student))
print(type(Student))
print(Student)
demo4:创建类对象
class Student: # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
native_place = '河南' # 直接写在类里的变量,成为类属性
def __init__(self, name, age): # 初始化方法
self.name = name # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
self.age = age
# 实例方法
def eat(self):
print('学生在吃饭...')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我是类方法,因为我使用了classmethod进行修饰')
# 在类之外定义的称为函数,在类之内的称为方法
def drink():
print('喝水')
# 创建Student类的对象
stu1 = Student('张三', 20) # stu1 称为实例对象
stu1.eat() # 对象名.方法名
print(stu1.name)
print(stu1.age)
print('-----------------')
'''
# 35行与30行代码功能相同,都是调用Student中的eat方法
# 类名.方法名(类的对象)--> 实际上就是方法定义处的self
'''
Student.eat(stu1)
- demo5:创建类对象(类方法与静态方法)
class Student: # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
native_place = '吉林' # 直接写在类里的变量,成为类属性
def __init__(self, name, age): # 初始化方法
self.name = name # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
self.age = age
# 实例方法
def eat(self):
print('学生在吃饭...')
# 静态方法
@staticmethod
def method():
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls):
print('我是类方法,因为我使用了classmethod进行修饰')
# 在类之外定义的称为函数,在类之内的称为方法
def drink():
print('喝水')
# 类属性的使用方式
print(Student.native_place)
stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print(stu1.native_place)
print(stu2.native_place)
Student.native_place = '天津'
print(stu1.native_place)
print(stu2.native_place)
# 类方法的使用方式
print('------------类方法的使用方式--------------')
Student.cm()
print('------------静态方法的使用方式--------------')
Student.method()
3. 实例对象
- demo6:实例对象
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name + '在吃饭')
stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print(id(stu1))
print(id(stu2))
print('---------为stu1动态绑定性别属性---------')
stu1.gender = '女'
print(stu1.name, stu1.age, stu1.gender)
# print(stu2.name, stu2.age, stu2.gender) # 报错 没有为stu2绑定gender属性
print(stu2.name, stu2.age)
print('--------------')
stu1.eat()
stu2.eat()
def show():
print('定义在类之外的,称函数')
stu1.show = show
stu1.show() # 为stu1动态绑定方法
# stu2.show() # 报错 因为stu2没有绑定show方法
4. 封装
- demo7:封装
class Car: # Car就是类对象
def __init__(self, brand):
self.brand = brand
def start(self):
print("汽车已启动...")
'''
__init__() start() 这两个在类中,就是被类包装起来了
'''
car = Car('宝马X5')
car.start()
print(car.brand)
- demo8:封装
class Student:
# 封装
def __init__(self, name, age):
self.name = name
self.__age = age # 年龄不希望在类的外部被使用,所以加了两个_
def show(self):
print(self.name, self.__age)
stu = Student('张三', 20)
stu.show()
# 在类的外部使用name 和 age
print(stu.name)
# print(stu.__age) # 不能使用?为什么?应该怎么使用__age呢?
print(dir(stu))
print(stu._Student__age) # 在类的外部可以通过 _Student__age 进行访问
'''
那封装还有什么意义吗?
靠程序员的自觉性,看到前面有两个_的属性,就尽量不要访问了,因为该属性不希望在类的外部被使用,
但是也可以使用,比如上面利用_Student__age来访问__age,但不建议这样做
'''
5. 继承 与 多继承
- demo9:继承
class Person(object): # Person继承object类
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person): # Student 继承Person类
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
class Teacher(Person): # Teacher 继承Person类
def __init__(self, name, age, teachofyear):
super().__init__(name, age)
self.teachofyear = teachofyear
stu = Student('张三', 20, '1001')
teacher = Teacher('李四', 34, 10)
stu.info()
teacher.info()
- demo10:多继承
class A(object): # A继承object类
pass
class B(object): # B继承object类
pass
class C(A, B): # C类继承A同时继承B
pass
6. 继承之方法重写
- demo11:继承之方法重写
class Person(object): # Person继承object类
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
class Student(Person): # Student 继承Person类
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
def info(self):
super().info()
print('学号', self.stu_no)
class Teacher(Person): # Teacher 继承Person类
def __init__(self, name, age, teachofyear):
super().__init__(name, age)
self.teachofyear = teachofyear
def info(self):
super().info()
print('教龄', self.teachofyear)
stu = Student('张三', 20, '1001')
teacher = Teacher('李四', 34, 10)
stu.info()
print('----------------')
teacher.info()
7. object类
- demo12:object类
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return '我的名字是{0},今年{1}岁了'.format(self.name, self.age)
stu = Student('张三', 20)
print(dir(stu)) # dir()查看属性和方法
print(stu) # 重写__str__()后,print默认会调用__str__()这样的方法
print(type(stu))
8. 多类
- demo13: 多类
class Animal(object):
def eat(self):
print('动物会吃')
class Dog(Animal):
def eat(self):
print('狗吃骨头')
class Cat(Animal):
def eat(self):
print('猫吃鱼')
class Person(object):
def eat(self):
print('人吃五谷杂粮')
# 定义一个函数
def fun(obj):
obj.eat()
# 开始调用函数
fun(Cat())
fun(Dog())
fun(Animal())
print('-----------------')
fun(Person())
9. 特殊属性
- demo14: 特殊属性
# print(dir(object))
class A:
pass
class B:
pass
class C(A, B):
def __init__(self, name, age):
self.name = name
self.age = age
class D(A):
pass
# 创建C类的对象
x = C('Jack', 20) # x是C类型的一个实例对象
'''
__dict__ 获得类对象或者实例对象所绑定的所有属性和方法的字典
'''
print(x.__dict__) # 实例对象的属性字典
print(C.__dict__)
print('-----------------')
print(x.__class__) # <class '__main__.C'> 输出了对象所属的类
print(C.__bases__) # C类的父类类型的元素
print(C.__base__) # 类的基类,离谁进输出谁 class C(A, B)输出A类,class C(B, A)输出B类
print(C.__mro__) # 类的层次结构
print(A.__subclasses__()) # 子类的列表
10. 特殊方法
- demo15:特殊方法
a = 20
b = 100
c = a + b # 两个整数类型的对象的相加操作
# 为什么能执行加法呢? 它的底层执行了什么?
d = a.__add__(b)
print(c)
print(d)
class Student:
def __init__(self, name):
self.name = name
def __add__(self, other): # 不编写这个方法,会报错
return self.name + other.name
def __len__(self):
return len(self.name)
stu1 = Student('张三')
stu2 = Student('李四')
s = stu1 + stu2 # 实现了两个对象的加法运算(因为在Student类中, 编写__add__()特殊的方法)
print(s)
s = stu1.__add__(stu2)
print(s)
print('-----------------')
lst = [11, 22, 33, 44]
print(len(lst)) # len是内置函数len
print(lst.__len__())
# print(len(stu1)) # 报错 'Student' has no len() ,若非要输出,要在类中编写__len__()函数
print(len(stu1)) # 编写一个__len__()函数后
- demo16:特殊方法2
"""
__new__()用于创建对象
__init__()对创建的对象进行初始化
new在前先创建对象
init在之后对实例对象进行赋值
"""
class Person(object):
def __new__(cls, *args, **kwargs):
print('__new__被调用执行了,cls的id值为{0}'.format(id(cls)))
obj = super().__new__(cls)
print('创建的对象的id为:{0}'.format(id(obj)))
return obj
def __init__(self, name, age):
print('__init__被调用执行了,self的id值为{0}'.format(id(self)))
self.name = name
self.age = age
print('object这个类对象的id为{0}'.format(id(object)))
print('Person这个类对象的id为{0}'.format(id(Person)))
# 创建Person类的实例对象
p1 = Person('张三', 20)
print('p1这个Person类的实例对象的id为{0}'.format(id(p1)))
11. 类的赋值
- demo17: 类的赋值
class CPU:
pass
class Disk:
pass
class Computer:
def __init__(self, cpu, disk):
self.cpu = cpu
self.disk = disk
# (1)变量的赋值
cpu1 = CPU()
cpu2 = cpu1
print(cpu1, id(cpu1)) # cpu1和cpu2的内存地址一样,说明实际上是一个对象放到了两个变量当中去存储
print(cpu2, id(cpu2))
# (2)类的浅拷贝
print('---------------------------------------')
disk = Disk() # 创建一个硬盘类的对象
computer = Computer(cpu1, disk) # 创建一个计算机类的对象
# 浅拷贝
import copy
print(disk)
computer2 = copy.copy(computer)
print(computer, computer.cpu, computer.disk)
print(computer2, computer2.cpu, computer2.disk)
print('--------------------------------------------')
# 深拷贝
computer3 = copy.deepcopy(computer)
print(computer, computer.cpu, computer.disk)
print(computer3, computer3.cpu, computer3.disk)