类是面向对象编程的核心。在Python中,我们要经常使用类,下面我们对其进行快速学习。下面我们一起看看6个常见Python类的概念和方法。1 定义类
class Corgi:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name}: 嗷呜~")
puppy = Corgi("短腿")
puppy.bark() # 短腿: 嗷呜~
Class用来定义类,Corgi("短腿")用来实例类,实例后即可使用类描述的方法。
其中__init__ 负责「初始化」,不是分配内存。也有说是构造函数。
用类创建对象时,Python 会先自动调用一个真正的构造方法 __new__(负责在内存里把对象“造”出来),随后立即调用 __init__给这个新对象做初始化即给对象的属性赋初值、做各种设置。
第一个形参 self 就是实例本身,就是“把对象自己”传进去,但它并不是你显式地“手工”传的,而是 Python 自动帮你把刚创建好的那个实例对象作为第一个实参塞进方法里。
在Python中,普通实例方法必须写 self,@staticmethod 和 @classmethod 不用写self 或写 cls。也就是说只要方法前面没加装饰器,默认就是实例方法 → 就必须写 self。
f 是 f-string(“格式化字符串字面量”)的标志,Python 3.6+ 引入的最简洁、最快的字符串插值写法。写了f 后,相当于告诉解释器:把花括号里的表达式先算出来,再转成字符串塞回去。
命令执行效果如下:
2 类变量 vs 实例变量
类变量是在类中直接定义的,而非通过方法来定义,实例变量则是通过方法来实现。
通过实例化类,就可以直接使用类的变量。
class Corgi:
species = "柯基" # 类变量,全家通用
def __init__(self, name):
self.name = name # 实例变量,各狗各的
3 私有属性
私有属性改变靠名字改写:__x → _类名__x ,满足一些特别的需要。在这里将变量增加为__money。
class DogBankAccount:
def __init__(self, money):
self.__money = money # 前面双下划线
def save(self, x):
self.__money += x
def show(self):
return self.__money
dba=DogBankAccount(100)
print(dba.__money)
print(dba._DogBankAccount__money)
直接访问__money,会报错。但是可以通过类目加属性进行实现。
从运行中可以看到,dba通过_类名__x实现了对私有属性的访问。
4 把方法变成“属性”
通过@property标签,可以把下面的方法变成属性,调用的时候,不用写括号。
class Circle:
def __init__(self, r):
self.r = r
@property
def area(self):
return 3.1416 * self.r ** 2
c = Circle(5)
print(c.area) # 看起来像属性,其实是函数
执行效果如下:
5 继承
继承是面向对象开发的核心,通过继承,可以让儿子继承父亲的技能,从而减少代码,方便维护。
class Animal:
def eat(self):
print("吃")
class Corgi(Animal):
def bark(self):
print("叫")
short=Corgi()
short.eat();
short.bark();
从代码中可以看到Corgi继承了Animal,实例化Corgi后,可以使用Animal的方法。
6 魔法方法:让对象“像原住民”
通过实现这些魔法方法,我们自定义的类对象能拥有和 Python 内置类型(比如列表、字符串、整数这些 “原住民”)一样的行为和使用体验。那什么是魔法方法呢?
Python常见的原生方法有:__str__、__len__、__add__、__getitem__、__setitem__ ,__sub__ , __mul__、__eq__ 、 __ne__、__enter__ 、 __exit__等。
而魔法方法就是在新定义的类中,按照特点格式实现该方法,然后就可以用调Python内置类型相似的方法进行调用啦。
代码:
class Score:
def __init__(self, math, chinese):
self.math = math
self.chinese = chinese
# 实现__add__,让两个成绩对象相加(总分相加)
def __add__(self, other):
if isinstance(other, Score): # 检查一个对象是否是指定类的实例
return Score(self.math + other.math, self.chinese + other.chinese)
# 创建一个新的 Score 对象
raise TypeError("只能和Score对象相加")
# 实现__str__,友好输出成绩
def __str__(self):
return f"数学:{self.math},语文:{self.chinese},总分:{self.math+self.chinese}"
s1 = Score(90, 85)
s2 = Score(80, 95)
s_total = s1 + s2 # 像整数相加一样用+
print(s_total)
直接使用,报错了。
这就是Python类的6个关键知识点,通过学习Python类的知识,可以帮助我们更好看懂Python代码,更好编写程序。