【Python】类和对象:构造函数、self参数、实例属性和类属性
Python类和对象2021/6/18 周五学习内容:类定义、创建实例、__init__()构造函数、self参数、self.__class__、类的方法、类的属性、实例属性、类属性刚接触Python,主要是看菜鸟教程、w3school 网站,以及电子工业出版社出版的Python编程入门指南上册的教材,并根据自己的情况对重点内容做的笔记。如有错误,欢迎在评论区指出,非常感谢!一、类定义使用 cla
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
>>> <__main__.MyClass object at 0x7fd10dca7e80>
属性的引用使用和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()
>>> 输出:
>>> <class '__main__.Person'>
self 不是 python 的关键字,只是在这里约定俗成的,也可以用其他名称替代。
比如上面的 self 改成 person 也是可以的:
class Person:
def __init__(person):
print(person.__class__)
Person()
>>> 输出:
>>> <class '__main__.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 <module>
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'
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)