chap12 (python全栈开发教程)

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方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值