一、面向对象
面向对象编程是一种将现实世界中的概念映射到程序中的编程范式。
1、类和对象
1.1、类
类是创建对象的 ”模板”。它包含
-
数据成员:表明事物的特征。 相当于变量
-
方法成员:表明事物的功能。 相当于函数
-
通过
class
关键字定义类。 -
类的创建语句语法:
class 类名 (继承列表):
实例属性(类内的变量) 定义
实例方法(类内的函数method) 定义
类变量(class variable) 定义
类方法(@classmethod) 定义
静态方法(@staticmethod) 定义
下面是代码示例
class Dog:
name = 'Dog'
age = 2
def eat(self):
print("Dog is eating")
return 'Dog is eating...'
dog01 = Dog()
类的创建的说明:
-
类名必须为标识符(与变量的命名相同,建议首字母大写)
-
类名实质上就是变量,它绑定一个类
1.2、对象
对象是类的实例,通过类创建。
1.3、继承
继承是一种机制,允许一个类(子类)继承另一个类(父类)的属性和方法。这样可以重用代码,减少冗余。
class Car:
def __init__(self, brand, price):
self.brand = brand
self.price = price
class BYD(Car):
def __init__(self, brand, price, year):
Car.__init__(self,brand, price)
self.year = year
def display(self):
print(f"这台BYD是{self.year}年生产的,是{self.brand}类型的 售价是{self.price}元")
byd = BYD("纯电动", 100000, 2024)
byd.display()
在这里,子类BYD继承了父类Car的brand和price两个属性
二、py中的类和对象
2.1、类的定义
在py中类通过class 来定义
class Person:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def work(self):
print(f"{self.name}上班挣了{self.salary}元")
def teach(self, student_name, skill):
print(f"{self.name}教{student_name}{skill}")
def learn(self, teacher_name, skill):
print(f"{self.name}向{teacher_name}学习{skill}")
2.2、__init__(构造函数)
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法(java 中称为:构造函数),在创建实例的时候,就把name,age等属性绑上去:
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
2.3、self
-
self
是类方法的第一个参数,用于引用对象本身。 -
self
不是Python关键字,但是约定俗成的命名,可以使用其他名称代替,但通常不建议。
2.4、类属性
-
类属性是类的属性,此属性属于类,不属于此类的实例
-
作用:
-
通常用来存储该类创建的对象的共有属性
-
-
类属性说明
-
类属性,可以通过该类直接访问
-
类属性,可以通过类的实例直接访问
-
-
类属性示例
class GsBank: price = 10000000 name = '中国工商银行总行' @classmethod def print_price(cls): print(f"总行剩余{cls.price}") def __init__(self, bank_name, bank_money): self.bank_name = bank_name self.bank_money = bank_money GsBank.price = GsBank.price - bank_money gsbank01 = GsBank("成都分行",1000000) gsbank02 = GsBank("北京分行",2000000) print(GsBank.price) GsBank.print_price()
2.5、类方法
-
类方法是用于描述类的行为的方法,类方法属于类,不属于该类创建的对象
-
说明
-
类方法需要使用 装饰器定义
-
类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls'
-
类和该类的实例都可以调用类方法
-
类方法不能访问此类创建的对象的实例属性
-
class GsBank: price = 10000000 name = '中国工商银行总行' count = 0 count1 = 0 @classmethod def print_price(cls): print(f"总行剩余{cls.price}") cls.count1 += 1 @classmethod def counter(cls): print(f"创建了{cls.count}个GsBank实例") cls.count1 += 1 def __init__(self, bank_name, bank_money): self.bank_name = bank_name self.bank_money = bank_money GsBank.price = GsBank.price - bank_money GsBank.count += 1 gsbank01 = GsBank("成都分行",1000000) gsbank02 = GsBank("北京分行",2000000) gsbank03 = GsBank("上海分行",1000000) gsbank04 = GsBank("深圳分行",1000000) print(GsBank.price) GsBank.print_price() GsBank.counter() print(GsBank.count1)
cls
在Python中,
cls
是一个约定俗成的名称,用于表示类本身。在类方法(使用@classmethod
装饰的方法)中,cls
作为第一个参数传递给方法。这使得类方法可以访问和修改类属性以及调用其他类方法,而不需要引用具体的实例。cls
的作用 -
访问类属性:类方法可以通过
cls
访问和修改类属性。 -
调用类方法:类方法可以通过
cls
调用其他类方法。 -
创建类实例:类方法可以使用
cls
来创建类的实例。
-
2.6、静态方法
-
静态方法是定义在类的内部函数,此函数的作用域是类的内部
-
说明
-
静态方法需要使用@staticmethod装饰器定义
-
静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数
-
静态方法只能凭借该类或类创建的实例调用
-
静态方法可以访问类属性但是不能访问实例属性
class Myclass: count = 0 def __init__(self, name): self.name = name @staticmethod def myadd(x,y): return x + y myclass01 = Myclass("张三") Myclass.myadd(1,3)
-