Python基础-Day07 面向对象初步-类(1)

目录

1. 类与对象

2. 类的定义

2.1 __init__构造方法

3. 实例属性、实例方法

3.1 实例属性

3.2 实例方法

3.3 其他操作

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

4.1 类对象

4.2 类属性

4.3 类方法

4.4 静态方法

5. __del__方法(析构函数)

6. __call__方法、可调用对象


1. 类与对象

通过类定义数据类型的属性(数据)和方法(行为),对象是类的具体实体,一般称为“类的实例”。

由一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属性值(不共享状态)。

注:Python 中,类也称为“类对象”,类的实例也称为“实例对象”。

2. 类的定义

语法格式如下:

        class 类名:
                类体

要点:

1)类名必须符合“标识符”的规则;一般规定,首字母大写,多个单词时使用“驼峰原则”。

2)可在类体中定义属性和方法。属性用来描述数据,方法(即函数)用来描述这些数据相关的操作。

2.1 __init__构造方法

需要定义__init__()构造方法,创建类的实例对象后,用以初始化当前对象的相关属性,无返回值。

要点:

1)构造方法名称必须为:__init__()

2)第一个参数固定,必须为 self,self 即为刚刚创建好的实例对象。

3)构造方法通常用来初始化实例对象的实例属性。

4)通过“类名(参数列表)”来调用构造方法,调用后,将创建好的对象返回给相应的变量。

5)若不定义__init__方法,系统会提供一个默认的__init__方法。

:创建对象时,系统默认使用__new__()方法(一般无需重定义该方法)。对象创建完成后,__init__()方法初始化创建好的对象,即“给实例属性赋值”。

3. 实例属性、实例方法

3.1 实例属性

实例属性是从属于实例对象的属性,也称为“实例变量”。

1)一般在__init__()方法中通过如下代码定义实例属性:self.实例属性名= 初始值;

2)在本类的其他实例方法中,也通过self 进行访问:self.实例属性名;

3)创建实例对象后,通过实例对象访问实例属性:
        obj = 类名()      #创建对象,调用__init__()初始化属性
        obj.实例属性名= 值     #可以给已有属性赋值,也可以新加属性

3.2 实例方法

实例方法是从属于实例对象的方法。实例方法的定义格式如下:

        def 方法名(self [, 形参列表]):
                函数体

方法的调用格式如下:对象.方法名([实参列表])

注:

1)定义实例方法时,第一个参数必须为self,self 意指当前的实例对象;

2)调用实例方法时,不需要也不能给self 传参。

3.3 其他操作

1)dir(obj):可以获得对象的所有属性、方法。

2)obj.__dict__ :对象的属性字典。

3)pass:空语句。

4)isinstance(对象,类型):判断“对象”是否为“指定类型”。

#测试类的定义、__init__方法、实例属性、实例方法 等

class Student:
    def __init__(self,name,score):
        self.name = name     #实例属性
        self.score = score

    def say_score(self):     #实例方法
        print("{0}的分数为{1}".format(self.name,self.score))

s1 = Student("小贝",60)       #s1 是实例对象,自动调用__init__()方法
s1.say_score()
Student.say_score(s1)         #系统的实际操作

s1.age = 12                   #增加新的属性
print("{0}的年龄是{1}".format(s1.name,s1.age))
print(s1.__dict__)            #测试obj.__dict__操作
print(isinstance(s1,Student))  #测试isinstance操作


'''
输出结果:
小贝的分数为60
小贝的分数为60
小贝的年龄是12
{'name': '小贝', 'score': 60, 'age': 12}
True
'''

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

4.1 类对象

类定义格式 “class 类名:” 中,当解释器执行class 语句时,会创建一个类对象。

#测试类对象

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

    def say_score(self):
        print("{0}的分数为{1}".format(self.name,self.score))

st = Student                #类也是对象
s1 = st("小贝",50)
s1.say_score()


#输出结果:小贝的分数为50

4.2 类属性

类属性是从属于“类对象”的属性,也称为“类变量”,可为所有实例对象所共享。

定义方式:
        class 类名:
                类变量名= 初始值

在类中或类外,可通过 “类名.类变量名” 读写类属性。

#测试类属性

class Student:

    company = "同福客栈"
    count = 0

    def __init__(self,name,score):
        self.name = name
        self.score = score
        Student.count += 1

    def say_score(self):
        print("{0}的公司为{1}".format(self.name,Student.company))
        print("{0}的分数为{1}".format(self.name,self.score))

s1 = Student("小贝",60)
s2 = Student("小宝",50)
s1.say_score()
print("一共创建了{0}个Student对象".format(Student.count))


'''
输出结果:
小贝的公司为同福客栈
小贝的分数为60
一共创建了2个Student对象
'''

4.3 类方法

类方法是从属于“类对象”的方法,通过装饰器@classmethod 进行定义,格式如下:

                @classmethod
                def 类方法名(cls [,形参列表]) :
                        函数体

注:

1)@classmethod 必须位于方法上面一行;

2)参数列表中,必须包括 cls ,意指“类对象”本身;

3)通过 “类名.类方法名(参数列表)” 调用类方法,不需要也不能给cls 传值;

4)类方法中访问实例属性和实例方法会导致错误。

4.4 静态方法

Python 中允许定义与“类对象”无关的方法,称为“静态方法”。

“静态方法”与模块中定义的普通函数没有区别,只是“静态方法”位于“类的名字空间”中,需要通过“类调用”。

静态方法通过装饰器@staticmethod 进行定义,格式如下:

                @staticmethod
                def 静态方法名([形参列表]) :
                        函数体
注:

1)@staticmethod 必须位于方法上面一行;

2)通过 “类名.静态方法名(参数列表)” 调用静态方法;

3)静态方法中访问实例属性和实例方法会导致错误。

#测试类方法、静态方法

class Student01:
    company = "同福客栈"      #类属性

    @classmethod             #类方法
    def printCompany(cls):
        print(cls.company)

Student01.printCompany()


class Student02:
    company = "同福客栈"

    @staticmethod            #静态方法
    def add(a,b):
        print("{}+{}={}".format(a,b,a+b))
        print(Student02.company)      #静态方法中访问类属性
        return a+b


Student02.add(230,140)


'''
输出结果:
同福客栈
230+140=370
同福客栈
'''

5. __del__方法(析构函数)

__del__方法称为“析构方法”,用于实现对象被销毁时所需的操作。

当对象的引用计数为0时,由垃圾回收器调用__del__方法。

#测试析构函数

class Person:
    def __del__(self):
        print("销毁对象:{0}".format(self))

p1 = Person()
p2 = Person()
del p2
print("程序结束")


'''
输出结果:
销毁对象:<__main__.Person object at 0x000001B6C05253C8>
程序结束
销毁对象:<__main__.Person object at 0x000001B6C050EE08>
'''

6. __call__方法、可调用对象

定义了__call__方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用。

#测试__call__方法

class SalaryAccount:
    '''工资计算类'''

    def __call__(self, salary):
        yearSalary = salary*12
        daySalary = salary//30
        hourSalary = daySalary//8

        return dict(yearSalary=yearSalary,monthSalary=salary,daySalary=daySalary,hourSalary=hourSalary)

s = SalaryAccount()

print(s(5000))


#输出结果:{'yearSalary': 60000, 'monthSalary': 5000, 'daySalary': 166, 'hourSalary': 20}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值