1.面向对象
面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件和应用程序。对象由数据和可以对这些数据执行的操作组成。
类:类是对象的蓝图或模板。它定义了对象的属性(数据元素)和方法(对象的行为)。
实例:实例是类的具体对象。每个实例都有其自己的属性值。
class 类名:
pass
# 类名规则:大驼峰MyName YourFirstChoice
class Person:
"""
人类模版
"""
pass
# 实例(对象)
# i0就是一个整数的实例
i0 = 100
# p0就是Person类的实例
# 类名() 默认返回一个实例
p0 = Person()
2. 方法
方法是在类中定义的一个函数,它可以被类的实例调用。
self:在类的方法中,self是一个指向实例本身的引用。它用于访问实例的属性和方法。
数据:存储在对象中的信息。
属性:对象的特性或数据元素。
操作:定义在对象上的方法,描述对象的行为。
行为:对象能够执行的操作。
初始化方法:初始化方法(或构造函数)是在创建对象时自动调用的特殊方法。它用于初始化对象的属性。
魔法方法:(或双下划线方法)是Python中一些特殊的方法,如_ _init_ _, _ _str_ _, _ _call_ _等。它们提供了一种方式来控制对象的创建、修改、比较、字符串表示等。
字符串方法:这些是定义在字符串对象上的方法,用于执行特定的字符串操作,如lower(), upper(), split()等。
class Person:
"""
类:Person
"""
def __init__(self, name_str, age_value):
print(id(self))
# 初始化self中的name与age属性
self.name = name_str
self.age = age_value
def __str__(self):
# 返回字符串
return f"姓名:{self.name} 年龄:{self.age}"
def display(self):
# 判断self类里是否有name属性
print(hasattr(self, "name"))
return f"名字:{self.name} 年纪:{self.age}"
# 实例p1与p2来源于self
p1 = Person("小白", 20)
print(id(p1), p1.name, p1.age)
print(p1.display())
p2 = Person("小黑", 18)
print(id(p2), p2.name, p2.age)
3.继承
继承是一种机制,允许一个类继承另一个类的属性和方法。这样,子类就可以重用父类的代码,并且可以添加或覆盖父类的行为,类名是一层层往上找。
父类:一个类可以有一个父类,也称为基类或超类,它是创建新类的模板。
子类:子类是一个新类,也称为派生类,它继承了一个或多个父类的属性和方法。子类可以添加新的属性和方法,或者覆盖父类的方法。
class Person:
# 父类
def __init__(self, name):
# 初始化name
self.name = name
def __str__(self):
return f"人"
class SuperMan(Person):
# Person的子类SuperMan
def __init__(self, name, skill):
Person.__init__(self, name)
self.skill = skill
def __str__(self):
return f"超{Person.__str__(self)} {self.skill}"
# 实例
sp1 = SuperMan("蜘蛛侠", "飞檐走壁")
print(sp1)
4.多态
多态是指允许不同类的对象以统一的方式处理。例如,允许使用基类的引用变量来存储派生类的对象。在Python中,多态通常通过动态类型和方法的重载和重写来实现。
Python可以认为没有多态 ,也可以认为到处都是多态。虽然Python没有像某些其他语言那样的显式类型系统来实现多态,但Python通过动态类型和方法的重载和重写实现了多态的概念。多态在Python中无处不在,例如在函数调用、操作符重载等方面。
重载多态:重载多态是指在同一作用域内对同一操作符或函数名赋予多种不同的含义。这在Python中是通过方法的重载实现的,即允许同一个方法名在不同的类中有不同的实现。
重写多态:重写多态是指子类覆盖父类中的虚函数或抽象方法,以提供自己的实现。这在Python中通过方法的重写实现,即子类可以定义与父类相同名称的方法来覆盖父类的实现。
class Person:
def walk(self, *args):
"""
通过args可变元祖参数实现重载
"""
print(f"走", args)
# 实例
p1 = Person()
# 方法,可以有多个参数
p1.walk(10)
p1.walk(10, 100)
class SuperPerson(Person):
# Person的子类 SuperPerson
def skill(self):
print(f"技能")
def walk(self):
"""
重写父类的walk
"""
print(f"超人走")
sp = SuperPerson()
sp.walk()
sp.skill()
5.实例与类的属性方法
实例属性:实例属性是与特定实例关联的属性。每个实例可以有自己的属性值。
实例方法:实例方法是与特定实例关联的方法。它们使用self参数来引用调用该方法的实例。
类属性:类属性是与类关联的属性,而不是与类的特定实例关联的属性。所有实例共享同一个类属性。
类方法:类方法是与类关联的方法,而不是与类的特定实例关联的方法。它们使用cls参数来引用调用该方法的类本身。
静态方法:静态方法是与类关联的函数,不需要访问类的状态或实例的状态。它们使用装饰器@staticmethod来定义。
class Person:
"""
类演示,实例与类的内容
"""
# 类属性:通过类名来访问
info = "人之初,性本善"
"""
类:Person
"""
@classmethod
# 类方法
def get_doc(cls):
return cls.__doc__, cls.__name__
@staticmethod
# 静态方法
def get_info():
return "有钱没钱回家过年"
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
def __init__(self, name):
"""
self 实例
形参name
"""
self.name = name
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
# 实例p1
p1 = Person("张")
p2 = Person("李")
# p1 p2的实例属性
print(p1.name)
print(p2.name)
# p1 p2的属性set_name与方法get_name
p1.set_name("张三")
print(p1.get_name())
p2.set_name("李四")
print(p2.get_name())
print(Person.info)
print(p1.info)
print(p2.info)
# 类属性:类名可以获取和修改属性,实例可以获取类属性
# 不能设置(设置是相当于给实例中添加了实例属性)
Person.info = "人之初,性本恶"
p1.info = "性相近,习相远1"
p2.info = "性相近,习相远2"
# 类属性
print(Person.info)
print(p1.info)
print(p2.info)
# 类方法
print(Person.get_doc())
# 静态方法
print(Person.get_info())