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'
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐