python学习笔记_第13天(面向对象初级)

类的定义

类也是对象,类是产生对象的对象,可以看做是type类型的模具。通过类来定义数据类型的属性(数据)和方法(行为),类是将属性和方法封装在一起。属性用来描述数据,方法(即函数)用来描述这些数据相关的操作。
同一个类创建的对象,“方法代码是共享的,属性数据不共享”,即每个对象会共享这个类的行为(类中定义的函数方法),但会有自己的属性值(不共享状态)。

类名必须符合“标识符”的规则;一般规定,首字母大写,多个单词使用“驼峰原则”。定义类的语法格式如下:
class 类名:
类体

class GoodStudent:  # 首字母大写,多个单词使用“驼峰原则”

    def __init__(self, name, score):  # 构造方法 __init__,存放类的属性。第一个参数必须为self。
        self.name = name  
        self.score = score
        
    def say_score(self):  # 类内的属性与方法第一个参数必是self,且不需要给self赋值,self 由解释器自动传参
        print('{0}的分数是:{1}'.format(self.name, self.score))

s1 = GoodStudent('张三', 90)  # s1 是实例对象,类名()自动调用__init__()构造方法,第一个参数self默认是新建对象存放的地址
s1.age = 15  #  可以给对象新增属性
s1.say_score()  # 调用类内方法
__init__构造方法和__new__方法

类是抽象的,也称之为“对象的模板”。通过类这个模板,创建类的实例对象,从而使用类定义的功能。
一个Python 对象包含如下部分:

  1. id(identity 识别码)
  2. type(对象类型–模具类)
  3. value(对象的值)
    (1) 属性(attribute)
    (2) 方法(method)
    在类中需要定义构造函数__init__()方法,构造方法用于执行“实例对象的初始化工作”,在对象创建后初始化当前对象的相关属性,即给实例属性赋值,无返回值。
    init()的要点如下:
  4. 名称固定,必须为:init()
  5. 第一个参数固定,必须为:self,self 指刚刚创建的实例对象。
  6. 构造函数通常用来初始化实例对象的实例属性。
  7. 通过“类名(参数列表)”来调用构造函数。调用后,将创建好的对象返回给相应的变量,第一个参数self默认是新建对象存放的地址。

类名()(s1 = GoodStudent(‘张三’, 90) )
首先调用__new__()方法–创建空对象(在类中一般无需重定义该方法),再调用__init__()方法–初始化创建好的对象,即给实例属性赋值(在类中如果不定义系统会提供一个默认的__init__方法,若自定义了带参的__init__方法,系统不创建默认的__init__方法)。

实例属性和实例方法

实例属性与实例方法都从属于实例对象,当实例对象被删除后,实例属性与实例方法同步删除

实例方法
  • 函数和方法的区别
  1. 本质一样都是用来完成一个功能的语句块
  2. 方法调用时,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点。
  3. 方法定义时需要传递self,普通函数不需要。
  • 实例对象的方法调用本质:
    在这里插入图片描述
    其他操作:
  1. dir(obj) – 获得对象的所有属性、方法
  2. obj.dict – 以字典形式展示对象自定义属性
  3. pass 空语句 – 定义一个空的类,先占位
  4. isinstance(对象,类型) 判断对象是不是在指定类型内

类对象、类属性、类方法、静态方法

类对象、类属性

类对象即“class 类名:”,当解释器执行class 语句时,就会创建一个类对象。type(Student)返回<class ‘type’>,type类型可视为模具类型。
类属性是从属于“类对象”的属性,也称为“类变量”,可以
被所有实例对象共享。在类中或者类的外面,可以通过【类名.类变量名】来读写。类属性的定义方式:
class 类名:
类变量名= 初始值

class Student:
    subject = "Python"  # 类属性
    count = 0  # 类属性

    def __init__(self, name, score):
        self.name = name  # 实例属性
        self.score = score  # 实例属性
        Student.count = Student.count + 1  # 调用类属性对此类创建的实例对象计数

    def say_score(self):  # 实例方法
        print("学的科目是:", Student.subject)
        print('{0}的分数是:{1}'.format(self.name, self.score))


s1 = Student('张三', 80)  # s1 是实例对象,自动调用__init__()方法
s1.say_score()
s2 = Student('李四', 90)
s3 = Student('王五', 88)
print('一共创建{0}个Student对象'.format(Student.count))

执行结果:
学的科目是: Python
张三的分数是:80
一共创建3个Student 对象!
在这里插入图片描述一个类只生成一个类对象,同一个类创建的对象,“方法代码是共享的,属性数据不共享”,即每个对象会共享这个类的行为(类中定义的函数方法),但会有自己的属性值(不共享状态)。

类方法、静态方法

类方法操作类属性,只属于类对象;实例方法操作实例属性,属于实例指向类对象中存储的代码对象。
类方法通过装饰器@classmethod 来定义,格式如下:
@classmethod
def 类方法名(cls [,形参列表]) :
函数体

  1. @classmethod 必须位于方法上面一行
  2. 第一个cls 必须有;cls 指的就是“类对象”本身;
  3. 调用类方法格式:“类名.类方法名(参数列表)”。参数列表中,不需要也不能给cls 传值。
  4. 类方法中访问实例属性和实例方法会导致错误
  5. 子类继承父类方法时,传入cls 是子类对象,而非父类对象

与类对象无关的方法,称为静态方法。静态方法和在模块中定义普通函数没区别,只是静态方法放入类对象内,需要通过类调用。
静态方法通过装饰器@staticmethod 来定义,格式如下:
@staticmethod
def 静态方法名([形参列表]) :
函数体
6. @staticmethod 必须位于方法上面一行
7. 调用静态方法格式:“类名.静态方法名(参数列表)”。
8. 静态方法中访问实例属性和实例方法会导致错误

class Student1:
    subject = "Python"  # 类属性
    count = 0  # 类属性

    @classmethod  # 类方法,操作类属性
    def PrintSubject(cls):
        print(cls.subject)
        # print(self.name)  # 类方法和静态方法中不能调用实例变量和实例方法

    @staticmethod  # 静态方法,是放在类对象内的普通函数可以return返回值
    def add(a, b):  
        print("{0}+{1}={2}".format(a, b, (a + b)))
        return a + b

    def __init__(self, name, score):
        self.name = name  # 实例属性
        self.score = score  # 实例属性
        Student.count = Student.count + 1  # 调用类属性对此类创建的实例对象计数

    def say_score(self):  # 实例方法
        print("学的科目是:", Student.subject)
        print('{0}的分数是:{1}'.format(self.name, self.score))


s1 = Student1('张三', 80)
s1.say_score()
Student1.PrintSubject()
Student1.add(20, 30)

执行结果:
学的科目是: Python
张三的分数是:80
Python
20+30=50
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值