• 【Python】类与实例(20)


    类的定义

    语法:

    class  类名:

         类体

    1、关键字class 表明定义的是类,与函数定义不同,类名的后面是不带小括号的;

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

    3、与C++类似,在类体中,可以定义属性和方法;属性用来描述状态(数据),方法则描述操作。

    1. class Student:
    2. def __init__(self,name,score): #构造方法第一个参数必须为self
    3. self.name = name #实例属性
    4. self.score = score
    5. def say_score(self): #实例方法
    6. print(self.name,'的分数是:',self.score)
    7. s1 = Student('张三',80) #s1是实例对象,自动调用__init__()方法
    8. s1.say_score()

    __init__() 就是类的构造函数 :

    1、左右两个下划线,名称必须是__init__ 表明是该类的构造函数

    2、python不支持函数重载,那么与C++不同,构造函数只能有一个;

    3、构造函数自动调用,第一个参数固定,必须为:self ,self其实就是C++中的this指针;C++中this指针经常隐藏,尤其是普通的成员函数则默认在编译的时候完成,Python 中的普通成员函数都会带上一个self ;

    4、如果不定义__init__方法,系统会提供一个默认的__init__方法。如果定义了带参的__init__方法,系统不创建默认的__init__方法;

    5、self并不是Python的关键字,你完全可以用其他单词取代他,只是按照惯例和标准的规定,推荐使用self。

    实例属性和实例方法

    类是模板,实例则是根据模板创建出来的一个个 “实体”。类所关注的是提取“共性”,实例则各有各的“个性”。

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

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

    2、在本类的其他实例方法中也可以定义实例属性,事实上因为__init__()方法在生成实例的时候会自动调用,所以通过它定义的属性在其他地方可以使用;

    3、创建实例对象后,还可以新加属性:

           obj01 = 类名()      #创建对象,调用__init__()初始化属性

            obj01.实例属性名 = 值    #可以给已有属性赋值,也可以新加属性

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

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

    函数体

    方法的调用格式如下:

    对象.方法名([实参列表])

    要点:

    1、定义实例方法时,第一个参数必须为self;

    2、调用实例方法时,self 会自动绑定为调用该方法的对象(this指针);

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

    定义一个类,在Python中就是生成了一个 “ 类对象 ”。如:

    1. class Person:
    2. pass
    3. print(type(Person))
    4. print(id(Person))
    5. T = Person
    6. x=T()
    7. print(id(x))

    Person这个类对象 在没有生成实例的时候就 已经存在,这点很重要,关系到类属性、类方法。

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

    class  类名:

          类变量名= 初始值

    在类中或者类的外面,可以通过:“类名.类变量名”来读写,也可以通过实例来访问:

    1. class Person:
    2. name="tom"
    3. print(Person.name)
    4. x=Person()
    5. print(x.name)

    值得注意的是,实例属性与类属性是可以同名的:

    1. class Person:
    2. Name="tom"
    3. def __init__(self):
    4. self.Name="jack"
    5. print(Person.Name) # tom
    6. x=Person()
    7. print(x.Name) # jack

    当然,应该尽量避免以上定义变量的问题。核心点:类属性可以被实例使用,实例属性当然不能被类调用。

    类方法是从属于“类对象”的方法。类方法通过装饰器@classmethod来定义,语法    :

    @classmethod

    def  类方法名(cls  [,形参列表]) :

           函数体

    classmethod必须位于方法上面,第一个参数为cls 必须有,cls指的就是“类对象”本身(类似self);调用类方法格式:“类名.类方法名(参数)”。 类方法不能访问实例属性和实例方法(没有self )。

    1. class Person:
    2. Name="tom"
    3. @classmethod
    4. def fun(c,rename): # 不一定必须为cls
    5. c.Name=rename # 只能访问类变量
    6. #Person.Name=rename # 也可以这样写
    7. Person.fun("jack")
    8. print(Person.Name)

    静态方法与类方法有很多类似的地方,区别在于类方法会自动带上cls (类对象),而静态方法没有。静态方法与函数(全局方法)不同之处在于静态方法需要通过类来调用。

    1. class Person:
    2. Name="tom"
    3. @staticmethod
    4. def fun(rename): #没有cls
    5. Person.Name=rename #使用类变量的是时候,只能通过类名来使用
    6. Person.fun("jack")
    7. print(Person.Name)

  • 相关阅读:
    数据结构 并查集
    内部错误: !scandr.cpp@815: eWasOpenForWrite
    PHP 运行模式, 各自的原理
    Part2_扩展MATSIM_Subpart12_其他模块_第42章 Matsim4Urbansim&第43章 停产模块
    Redis常用命令补充和持久化
    Greenplum广播与重分布原理
    永磁同步电机36问(三)——SVPWM代码实现
    vue实现防抖函数、节流函数,全局使用【输入框、按钮】
    机器学习---预剪枝、后剪枝(REP、CCP、PEP、)
    Kotlin 知识体系
  • 原文地址:https://blog.csdn.net/yixiaobo2001/article/details/127420427