python源码中的学习笔记_第9章_类与对象

编程的两大思想

#
# 主题:编程的两大思想
#

# 面向过程:事物比较简单,可以用线性的思维解决
# 面向对象:事物比较复杂,无法用线性的思维解决
# 共同点:都是解决实际问题的思维方式
# 解决复杂问题,通过面向对象方式便于从宏观上把握事物之间复杂的关系,方便我们分析整个系统
# 具体到微观操作,仍然使用面向过程的方式来处理

类与对象

#
# 主题:类与对象
#

if __name__ == '__main__':
    # 类:多个类似事物组成的群体的统称。能够帮助我们快速理解和判断事物的性质
    # 对象:100,99,25 都是 int 类下面包含的相似的不同个例,这些个例专业术语成为实例或对象
    # python 中一切皆对象

    # 不同的数据类型属于不同的类
    # 使用内置函数 type 查看数据类型
    print(type(100))            # <class 'int'>

创建类

#
# 主题:创建类
#

class Student:          # Student 是类名,使用大驼峰法命名
    pass

print(id(Student))      # 地址 2162215694248
print(type(Student))    # 数据类型 <class 'type'>
print(Student)          # 值 <class '__main__.Student'>

# 类的组成:类属性,实例方法,静态方法,类方法

class MyStudent:
    '''
    功能:MyStudent 类
    '''

    # 类属性
    native_place = '吉林'     # native_place 是类属性,即直接写在类中的变量

    # 初始化方法
    def __init__(self, name, age):
        self.name = name    # self.name 和 self.age 是实例属性
        self.age = age

    # 实例方法:在类中定义的函数(在类外定义的函数叫函数)
    def eat(self):
        print('学生在吃饭')

    # 静态方法:
    @staticmethod            # 使用 staticmethod 修饰,则下面定义的方法是静态方法
    def method():
        print('我是静态方法')

    # 类方法
    @classmethod            # 使用 classmethod 修饰,则下面定义的方法是类方法
    def cm(cls):
        print('我是类方法')

创建对象

#
# 主题:创建对象
#

class MyStudent:
    '''
    功能:MyStudent 类
    '''

    # 类属性
    native_place = '吉林'     # native_place 是类属性,即直接写在类中的变量

    # 初始化方法
    def __init__(self, name, age):
        self.name = name    # self.name 和 self.age 是实例属性
        self.age = age

    # 实例方法:在类中定义的函数(在类外定义的函数叫函数)
    def eat(self):          # self 与 JavaScript 中的 this 关键字的功能类似
        print('学生 %s 在吃饭' % self.name)

    # 静态方法:
    @staticmethod            # 使用 staticmethod 修饰,则下面定义的方法是静态方法
    def method():
        print('我是静态方法')

    # 类方法
    @classmethod            # 使用 classmethod 修饰,则下面定义的方法是类方法
    def cm(cls):
        print('我是类方法')

# 创建 MyStudent 类的对象:类的实例化
stu1 = MyStudent('张三', 20) # stu1 是 MyStudent 类对象的一个实例对象
print(id(stu1))             # 1722168051696 十六进制为0x00000197880107F0
print(type(stu1))           # <class '__main__.MyStudent'>
print(stu1)                 # <__main__.MyStudent object at 0x00000197880107F0>

# MyStudent 是类对象
# stu1 是实例对象

# 调用类中的方法
print('---')
stu1.eat()                  # 学生 张三 在吃饭
                            # stu1 调用了 eat 方法,则 self 就是 stu1
print(stu1.age)             # 20
MyStudent.eat(stu1)         # 学生 张三 在吃饭
                            # 直接将 stu1 实例对象放在 self 参数的位置,从而代替了 self
                            # stu1.eat() 语句功能相同

类属性,类方法,静态方法

#
# 主题:类属性,类方法,静态方法
#

class MyStudent:
    '''
    功能:MyStudent 类
    '''

    # 类属性
    native_place = '吉林'     # native_place 是类属性,即直接写在类中的变量

    # 初始化方法
    def __init__(self, name, age):
        self.name = name    # self.name 和 self.age 是实例属性
        self.age = age

    # 实例方法:在类中定义的函数(在类外定义的函数叫函数)
    def eat(self):          # self 与 JavaScript 中的 this 关键字的功能类似
        print('学生 %s 在吃饭' % self.name)

    # 静态方法:
    @staticmethod            # 使用 staticmethod 修饰,则下面定义的方法是静态方法
    def method():
        print('我是静态方法')

    # 类方法
    @classmethod            # 使用 classmethod 修饰,则下面定义的方法是类方法
    def cm(cls):
        print('我是类方法')

# 类属性:处于类中、方法外的变量,他被该类的所有对象所共享
# 类方法:使用 @classmethod 修饰的方法,使用类名直接访问
# 静态方法:使用 @staticmethod 修饰的方法,使用类名直接访问
# 实例对象通过类指针访问类对象中的属性和方法

if __name__ == '__main__':
    print(MyStudent.native_place)       # 吉林
    stu1 = MyStudent('张三', 20)
    stu2 = MyStudent('李四', 35)
    print(stu1.native_place)            # 吉林
    print(stu2.native_place)            # 吉林
    MyStudent.native_place = '天津'
    print(stu1.native_place)            # 天津
    print(stu2.native_place)            # 天津

    # 类方法
    print('---')
    MyStudent.cm()                      # 我是类方法
    stu1.cm()                           # 我是类方法

    # 静态方法
    print('---')
    MyStudent.method()                  # 我是静态方法

动态绑定属性和方法

#
# 主题:动态绑定属性和方法
#

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.name + '在吃饭')

if __name__ == '__main__':
    # 一个 Student 类可以有多个实例对象
    # 每个实例对象的属性值(如name)可以不同
    stu1 = Student('张三', 20)
    stu2 = Student('李四', 22)
    print(id(stu1))             # 2702256703472
    print(id(stu2))             # 2702256705376

    # 为 stu2 动态绑定属性
    print('---')
    stu2.gender = '女'    # 动态绑定属性
                          # gender 属性是在实例对象定义之后建立的,只适用于特定的实例对象,而不是用 Student 类的所有实例对象
                          # Student 类中的初始化方法中定义的属性是在实例对象定义之前建立的,适用于 Student 类的所有实例对象
    print(stu1.name, stu1.age)              # 张三 20
    print(stu2.name, stu2.age, stu2.gender) # 李四 22 女
    # print(stu1.gender)                    # stu1 没有 gender 属性,会报错

    # 动态绑定方法
    print('---')
    def show():             # 定义在类外的是函数
        print('我是函数')
    stu1.show = show        # 动态绑定方法
    stu1.show()             # 我是函数
    # stu2.show()           # stu2 没有 show 方法,会报错
    

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值