目录
1、面向对象
2、类
3、实例
4、初始化方法
5、魔法方法
6、字符串方法
7、self
8、数据、属性、操作、行为
9、父类、基类、超类 or 子类、派生类
10、多态
11、重载多态 and 重写多态
12、名称解释
1、面向对象
在Python中,面向对象编程(OOP)是一种非常重要的编程范式。在Python中,可以通过创建类(class)和实例化对象(object)来使用面向对象的编程思想。
下面是一个简单的例子,People是一个类,__init__方法是一个魔法方法,在创建对象时被调用,用于初始化对象的属性。
class Person:
def __init__(self, name):
self.name = name
# 初始化实例
p1 = Person("小白")
print(p1.name)
2、类
在Python中,类是一种用来创建对象的蓝图或模板。通过定义类,可以定义对象的属性和方法。
class
关键字用于定义一个类,在类的内部,你可以定义各种属性和方法。
- 属性(attribute):类的属性是与该类相关联的数据。
- 方法(method):类的方法是与该类相关联的函数。方法的第一个参数通常是
self
,代表对当前对象的引用。
通过类,可以创建对象的实例,并调用对象的方法来完成相关操作。
class Person:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
# 定义一个实例
p1 = Person("小白")
# 实例拥有属性
print(p1.name)
# 通过实例调用类里面定义的函数方法
print(p1.get_name())
3、实例
在Python中,实例是由类创建的对象。通过实例,可以使用类中定义的属性和方法。
在上面的代码中,Person是一个类,p1是 Person类创建的一个实例。通过实例,我们可以使用 Person类中定义的属性和方法。例如,我们可以通过 p1.name
访问实例的 name
属性,并通过 p1.get_name() 调用实例的 get_name方法。
4、初始化方法
在Python中,初始化方法是一个特殊的方法,用于创建类的实例并初始化实例的属性。初始化方法的名称为 __init__
,并且第一个参数通常是 self
,代表对当前对象的引用。通过初始化方法,可以在创建对象时设置对象的初始状态。
在上面的代码中,__init__
方法被用来初始化实例的 name
属性。在创建实例时,我们传递了 name
参数,并将它们存储在实例的属性中。
需要注意的是,初始化方法是可选的。如果你没有定义初始化方法,Python会提供一个默认的初始化方法。但通常情况下,你需要自己定义初始化方法来完成对象的初始化工作。
另外,除了 __init__
方法外,还有其他一些特殊方法可以用来定制类的行为。这些特殊方法被称为“魔术方法”,例如 __str__
方法用于定义对象的字符串表示形式,__eq__
方法用于定义对象的相等性判断等。熟练掌握这些特殊方法可以让你更好地定制类的行为。
5、魔法方法
在Python中,魔术方法(Magic Methods)是一种特殊的方法,用双下划线 __
开头和结尾命名的方法。这些方法用于定制类的行为,例如实现对象的比较、转换、算术运算等功能。通过使用魔术方法,可以让类与Python的内置功能更好地集成。
例如 __str__
方法用于定义对象的字符串表示形式,__doc__获取类的文档注释。
class Person:
"""
这里是Person的文档注释
"""
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
def __str__(self):
return f"姓名:{self.name}"
p1 = Person("小白")
print(p1)
print(p1.__doc__)
6、字符串方法
在Python中,类的 __str__()
方法是一种特殊的方法,用于返回对象的字符串表示形式。当打印一个对象或使用 str(obj)
函数时,Python会自动调用该对象的 __str__()
方法来获取其字符串表示。
上面的示例中,Person
类定义了一个 __init__()
方法来初始化对象的属性,以及一个 __str__()
方法来返回对象的字符串表示。在 __str__()
方法中,我们使用了格式化字符串(f-string)来构建要返回的字符串。
通过定义 __str__()
方法,我们可以控制对象的字符串表示,使其更有意义和可读性。这在调试和输出对象信息时非常有用。
7、self
在Python中,self
是一个特殊的参数,用于表示对象实例本身。当你调用类的方法时,Python会自动将对象实例传递给方法的第一个参数,通常被命名为 self
。
通过使用 self
,可以在类的方法中访问对象的属性和其他方法。在上面的示例中,self
参数被用来访问对象实例的 name
属性。
总之,self
是Python中用来表示对象实例自身的约定俗成的名称,通过它可以在类的方法中访问对象的属性和方法。
8、数据、属性、操作、行为
在面向对象编程中,常常使用以下概念来描述类和对象的不同方面:
-
数据(Data):数据是类的属性(也称为实例变量),用于表示类的状态和特征。它们存储在对象中,并且每个对象都可以具有不同的数据值。例如,在一个人(Person)类中,年龄(age)和姓名(name)可以是该类的数据。
-
属性(Attribute):属性是类的数据和方法的统称。它们是类和对象的特征,并且可以通过点符号来访问。属性可以是类级别的,被所有对象共享,也可以是对象级别的,每个对象独立拥有自己的属性。
-
操作(Operation):操作是类的方法(也称为成员函数),用于执行特定的功能或操作。操作定义了类可以做什么以及如何与对象进行交互。例如,在一个人(Person)类中,
say_hello()
可以是一个操作,用于打印出个人问候信息。 -
行为(Behavior):行为是对象对外部请求做出的响应。它描述了对象如何根据接收到的消息作出反应。行为由类的方法实现,使对象能够执行某些动作或操作。例如,在一个人(Person)类中,行走(walk)可以是一个行为,用于移动对象的位置。
这些概念相互关联,共同构成了面向对象编程的基础。数据和属性描述了类和对象的特征,操作和行为描述了类和对象的行为和功能。通过将数据、属性、操作和行为组合在一起,可以创建具有丰富功能和交互能力的类和对象。
9、父类、基类、超类 or 子类、派生类
在面向对象编程中,一个类可以继承自另一个类,被继承的类称为父类(Parent Class)、基类(Base Class)或超类(Superclass),而继承的类称为子类(Subclass)或派生类(Derived Class)。
class Person:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
def __str__(self):
return f"姓名:{self.name}"
class Student(Person):
def __init__(self, name, age):
Person.__init__(self, name)
self.age = age
def get_age(self):
return self.age
s = Student("小白", 25)
# 子类可以调用自己的方法
print(s.get_age())
# 子类调用父类的方法
print(s.get_name())
print(s)
在上述示例中,Person是父类,Student是子类。子类 Student继承了父类 Person的 __init__()
和 get_name()
方法,并且还定义了自己的 get_age()
方法。
通过继承,子类可以直接使用父类的属性和方法,并且还可以在子类中添加自己的特定行为。这样可以减少代码的重复,并且使得程序的设计更加灵活和可扩展。
10、多态
python没有多态 python到处都是多态
多态是面向对象编程中的一个重要概念,指的是同一操作作用于不同的对象,可以有不同的解释和实现,产生不同的执行结果。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。
在多态中,子类可以将自己的实例化对象传递给父类的方法,从而实现对父类方法的重载或覆盖。当程序执行时,会根据实际传入的对象类型来决定调用哪个方法,从而实现不同的行为。
class Animal:
def __init__(self, name):
self.name = name
def sound(self):
print("Animal makes a sound")
class Dog(Animal):
def sound(self):
print("Dog barks")
class Cat(Animal):
def sound(self):
print("Cat meows")
# 创建Animal、Dog和Cat对象
animal = Animal("Animal")
dog = Dog("Dog")
cat = Cat("Cat")
# 调用各自的sound()方法
animal.sound() # 输出:Animal makes a sound
dog.sound() # 输出:Dog barks
cat.sound() # 输出:Cat meows
11、重载多态 and 重写多态
重载多态(Overloading Polymorphism)和重写多态(Overriding Polymorphism)都是多态性的体现,但它们实现多态性的方式不同。
重载多态指的是在一个类中定义多个同名方法,但是这些方法的参数类型、个数或顺序不同,从而在调用该方法时根据传入的参数类型、个数或顺序来决定调用哪个方法。重载多态是通过编译期间静态绑定来实现的。
重写多态指的是子类对父类方法的重写或覆盖,从而使得同样的方法调用对于不同的对象可以产生不同的行为。重写多态是通过运行期间动态绑定来实现的。
12、名称解释
- (1)实例属性:在Python中,实例属性是与类的实例相关联的属性,每个类的实例都可以具有不同的实例属性值。实例属性通常在类的构造方法(通常是
__init__
方法)中定义,并且它们通过self
关键字与实例关联。- (2)实例方法:在Python中,实例方法是与类的实例关联的方法,它们通过类的实例调用。实例方法的第一个参数通常是
self
,它代表调用该方法的实例本身。通过self
,实例方法可以访问和操作实例的属性。- (3)类属性:在Python中,类属性是与整个类关联的属性,而不是与类的实例关联。类属性是在类级别上定义的属性,它们在所有类的实例之间共享相同的值。类属性通常在类的顶层定义,而不在任何方法内。
- (4)类方法:在Python中,类方法是与类关联而不是与类的实例关联的方法。类方法使用
@classmethod
装饰器进行定义,并且其第一个参数通常是cls
,表示类本身。类方法可以通过类调用,而不需要创建类的实例。- (5)静态方法:在Python中,静态方法是与类关联的方法,但与实例无关。静态方法使用
@staticmethod
装饰器进行定义,与普通的函数类似,但位于类的命名空间中。静态方法既不需要表示实例的self
参数,也不需要表示类的cls
参数。
- (5)静态方法:在Python中,静态方法是与类关联的方法,但与实例无关。静态方法使用
- (4)类方法:在Python中,类方法是与类关联而不是与类的实例关联的方法。类方法使用
- (3)类属性:在Python中,类属性是与整个类关联的属性,而不是与类的实例关联。类属性是在类级别上定义的属性,它们在所有类的实例之间共享相同的值。类属性通常在类的顶层定义,而不在任何方法内。
- (2)实例方法:在Python中,实例方法是与类的实例关联的方法,它们通过类的实例调用。实例方法的第一个参数通常是
class Person:
# 类属性
info = "hello"
# 类方法
@classmethod
def get_cls(cls):
return cls.__name__
# 静态方法
@staticmethod
def get_info():
return Person.info
# 初始化实例
def __init__(self, name):
self.name = name
# 实例方法
def get_name(self):
return self.name
def __str__(self):
return f"姓名:{self.name}"
# p1是一个实例
p1 = Person("小白")
# 实例属性
print(p1.name)
# 通过实例调用实例方法
print(p1.get_name())
# 通过类名调用类属性
print(Person.info)
print(Person.get_cls())
print(Person.get_info())