【Python】类和对象:构造函数、self参数、实例属性和类属性

您所在的位置:网站首页 python构造类的方法 【Python】类和对象:构造函数、self参数、实例属性和类属性

【Python】类和对象:构造函数、self参数、实例属性和类属性

2023-09-27 21:45| 来源: 网络整理| 查看: 265

Python类和对象

2021/6/18 周五 学习内容:类定义、创建实例、删除实例、__init__()构造函数、self参数、self.__class__、类的方法、类的属性、实例属性、类属性、删除属性

刚接触Python,主要是看 菜鸟教程、w3school 网站,以及电子工业出版社出版的Python编程入门指南上册的教材,并根据自己的情况对重点内容做的笔记。

如有错误,欢迎在评论区指出,非常感谢!

一、类定义

使用 class 关键字创建类:

class ClassName: statement

ClassName 类名一般使用大写字母开头的驼峰式命名法。

statement 类体主要由类的变量、方法和属性等定义语句组成,如果在定义类时没想好,也可以使用pass语句。

二、类的实例 1. 创建类的实例对象

在Python中创建实例对象不使用new关键字。

直接用类名加括号就可以创建实例对象:

class MyClass: """一个简单的类实例""" x = 5 p1 = MyClass() print(p1.x) print(p1) >>> 输出: >>> 5 >>>

属性的引用使用和Python中所有的属性引用是一样的标准语法:obj.name。

类对象创建后,类命名空间中所有的命名都是有效属性名。

2. 删除对象

用del关键字删除类的实例对象

del p1 print(p1) >>> 报错: >>> NameError: name 'p1' is not defined 三、__init__() 构造函数

所有类都有一个名为 __init__() 的构造函数(init前后都是双下划线),在类实例化时会自动调用。

使用构造函数可以将值赋给对象属性,或者执行在创建对象时需要执行的其他操作。

__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。

例如实例化Person类:

class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person("Hanne", 24) print(p1.name, end=" ") print(p1.age) >>> 输出: >>> Hanne 24 四、self参数

类的方法都必须包含一个self参数,并且必须是第一个参数,用于访问属于该类的变量。

它类似于Java的this,是对类的当前实例的引用,代表当前对象的地址。

用 self.__class__ 指向该类(class前后都是双下划线):

class Person: def __init__(self): print(self.__class__) Person() >>> 输出: >>>

self 不是 python 的关键字,只是在这里约定俗成的,也可以用其他名称替代。

比如上面的 self 改成 person 也是可以的:

class Person: def __init__(person): print(person.__class__) Person() >>> 输出: >>> 五、类的方法

类的成员主要由 类的方法 和 类的属性(即类的数据成员) 组成,在创建了类的成员后,可以通过类的实例进行访问。

在类的内部,使用def关键字来定义方法,且第一个参数是参数self。

class Person: def __init__(self, name, age): self.name = name self.age = age def prt(self): print("Hello, "+self.name) p = Person("Hanne",24) p.prt() >>> 输出: >>> Hello, Hanne

在 prt() 方法中,直接用 self 参数就能访问构造方法中定义的属性,因为用self定义的都是属于这个类的变量。

六、类的属性

根据定义位置,分为实例属性和类属性。

1. 实例属性

实例属性是指定义在方法中的属性,只作用于当前实例中。

在上面例子中的name和age就是实例属性。

实例属性只能通过实例名访问,如果通过类名访问,会报错类中没有该属性:

p = Person("Hanne",24) print(p.age) >>> 24 print(Person.age) >>> Traceback (most recent call last): File "/usercode/file.py", line 15, in print(Person.age) AttributeError: type object 'Person' has no attribute 'age' 2. 修改实例属性

实例属性通过实例名称来修改,实例属性修改后,并不影响该类的另一个实例对象相应的实例属性的值。

class Person: def __init__(self): self.age = 23 p1 = Person() p2 = Person() p1.age = 18 print(p1.age) print(p2.age) >>> 输出: >>> 18 >>> 23 3. 类属性

类属性是定义在类中,并且在函数体外的属性。类属性可以在类的所有实例之间共享值。

类属性可以通过类名或者实例名访问:

class Person: age = 23 p = Person() print(Person.age) print(p.age) >>> 输出: >>> 23 >>> 23

但是如果也有个实例属性是同样的名称的话,用实例名访问到的就是实例属性:

class Person: age = 23 def __init__(self, age): self.age = age p = Person(24) print(Person.age) print(p.age) >>> 输出: >>> 23 >>> 24 4. 修改类属性

类属性只能通过类名修改,修改后已经创建的实例对象的相应属性不受影响,但新创建的实例对象的相应属性的值会改变:

class Person: age = 23 p = Person() p.age = 18 print(Person.age, end = " ") print(p.age) >>> 23 18 >>> 实例名无法修改类属性,只能修改当前实例对象的属性 Person.age = 20 print(Person.age, end = " ") print(p.age) >>> 20 18 >>> 用类名修改类属性,但之前创建的p实例对象不受影响 p2 = Person() print(p2.age) >>> 20 >>> 新创建的实例对象p2的相应属性就是类属性修改之后的了 5. 删除属性

用del关键字删除属性:

class Person: name = 'Hanne' def __init__(self): self.age = 23 p = Person() print(p.name,end = ' ') print(p.age) >>> 输出: >>> Hanne 23 del Person.name print(Person.name) >>> 报错: >>> AttributeError: type object 'Person' has no attribute 'name' del p.age print(p.age) >>> 报错: >>> AttributeError: 'Person' object has no attribute 'age'


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3