2022.11.9~2022.11.10
1.类与对象
# 类与对象
class Student: # Student为类的名称(类名),由一个或多个单词组成,每个单词首字母大写,其余小写 不遵循程序不报错,但是是默认规则
pass
# Python中一切皆对象,Student是对象吗?内存有开空间吗? 一个类对象
print(id(Student)) # 1733497927536
print(type(Student)) # <class 'type'> class类型
print(Student) # <class '__main__.Student'> <--value值
# 在类之外定义的称为函数,在类之内定义的称为方法
def drink(): # 函数
print('喝水')
①类的创建
# 类的创建 Student【类对象】
class Student:
native_place='吉林' # 直接写在类里的变量,称为类属性
def __init__(self,name,age): # 初始化方法 带self,后面可继续写
self.name=name # 赋值操作 self.name称为【实例属性】/实例变量,在这里进行了一个赋值操作,将局部变量(形参)name的值赋给实例属性;习惯上局部变量(=后的name)(形参)和属性名name(前一个)相同,也可以不同
self.age=age
# 实例方法
def eat(self): # self必须写 self--默认参数
print('学生在吃饭...')
# 静态方法
@staticmethod
def method(): # 静态方法中不允许使用self 没有任何默认参数
print('我使用了staticmethod进行修饰,所以我是静态方法')
# 类方法
@classmethod
def cm(cls): # 类方法中要求写一个cls(默认参数)
print('我是类方法,因为我使用了classmethod进行修饰')
②对象的创建
# 创建【Student类的【(实例)对象】】 实例名=类名()
stu1=Student('张三',20) # 看__init__方法中有两个参数 一个对象创建完毕 stu1是根据类对象创建出的实例对象
print(id(stu1)) # 2010534547712
print(type(stu1)) # <class '__main__.Student'> <--Student的类型
print(stu1) # <__main__.Student object at 0x000001D41D329100> <--Student对象内存地址的16进制
print('--------------------------------------------')
print(id(Student)) # 1684853996160 Student是类的名称
print(type(Student)) # <class 'type'>
print(Student) # <class '__main__.Student'>
③调用类的方法和属性;类属性、类方法、静态方法的使用方式
# Student类的【实例对象】 可以调用类中的方法和属性
stu1=Student('张三',20)
print(stu1.name) # 调用类的属性
print(stu1.age) # 调用类的属性
# 调用类的实例方法
stu1.eat()
Student.eat(stu1) # 也可以这样调用类的实例方法 传过来一个对象就可以---stu1
# Student.eat(stu1) 和 stu1.eat() 功能相同,都是调用Student中的eat方法
# eat(self) self--自身,要求传入一个Student对象, stu1.eat() 中,stu1是Student对象,可以传进来
# stu1.eat() 对象名.方法名 Student.eat(stu1) 类名.方法名(类的对象)-->实际上就是方法定义处的self
# 类属性的使用方式
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) # 天津
# 类方法的使用方式
Student.cm() # 使用类名调用 cls在调用时不需要传入
# 静态方法的使用方式
Student.method() # 使用类名直接使用它
2.动态绑定属性和方法
# 动态绑定属性和方法
class Student: # 类对象 class对象
def __init__(self, name, age): # 定义一个初始化方法__init__
self.name=name # 将局部变量值赋给实例变量
self.age=age # self.name、self.age 是Student类的所有对象都有的
def eat(self):
print(self.name+'在吃饭') # 定义完了一个类
# 创建类的对象
stu1=Student('张三', 20) # 类指针指向所创建对象的类型
stu2=Student('李四', 30) # 创建完了两个Student类的实例对象
# Student类可以创建N多个实例对象,每个实例对象的属性值是可以不同的,也可以相同
print(id(stu1))
print(id(stu2))
'''为stu2动态绑定性别属性 在程序创建完对象之后所绑定的属性只适用于当前绑定的对象 可以动态地绑定属性、方法'''
stu2.gender='女' # 直接绑定为女就可以 gender只隶属于stu2,stu1不允许使用
print(stu1.name,stu1.age) # stu1也输出性别会报错
print(stu2.name,stu2.age,stu2.gender)
'''为stu1动态绑定方法'''
stu1.eat()
stu2.eat()
def show():
print('定义在类之外的,称函数')
stu1.show=show # 把定义的这个函数绑定在stu1这个对象上 函数绑定到对象上就称为方法
stu1.show() # stu1调用show方法
# stu2.show() # 程序报错,因为stu2没有绑定show方法