一.对象
在python中,对象(Object)是指在内存中具有唯一标识符,类型和值的实例。即,它具有一个属性和方法的实体,这些属性和方法可以被访问和操作。
#唯一标识符其实是在内存中的地址
string='dhj'
print(id(string))
#输出为 2690681374960
对象其实就是保存在内存中的一段数据,python中一切皆为对象,变量是指向一个对象的引用
def printf(name): #printf函数,打印出name
print(name)
copy_func = printf #把printf对象拷贝给copy_func对象
copy_func("libai")
#输出为libai
二.类
在 Python 中,类是一种数据结构,用于描述一类具有相似属性和行为的对象。类定义了对象的属性和方法,对象则是类的实例化,具有类定义的属性和方法。
Python 类的一些重要概念和特性:
-
属性(Attribute):类的属性是描述类的特征的变量,也称为数据成员。类的属性可以是数值、字符串、函数、类等等。
-
方法(Method):类的方法是描述类的行为的函数,也称为成员函数。类的方法可以访问和修改类的属性,还可以调用其他方法。
-
实例化(Instantiation):实例化是指创建一个类的对象,对象是类的一个具体实例,拥有类定义的属性和方法。
-
继承(Inheritance):继承是指一个类可以从另一个类中继承属性和方法。子类可以在不修改父类的情况下扩展父类的功能。
-
多态(Polymorphism):多态是指不同类的对象可以实现相同的方法,从而实现相同的行为。多态可以提高代码的可读性和复用性。
-
魔法方法(Magic Method):魔法方法是以双下划线开头和结尾的特殊方法,用于实现类的特定行为,例如构造函数
__init__
、转换为字符串的方法__str__
等等。
2.1类的属性
Python语言中的属性操作遵循三个规则:
(1)属性的获取是按照从下到上的顺序来查找属性;
(2)类和实例是两个完全独立的对象;
(3)属性设置是针对实例本身进行的。
类的定义由属性和方法组成,属性
是对数据
的封装,方法
则是对类行为
的封装。属性按使用范围分为公有属性
和私有属性
,使用范围取决于属性名称。类的属性如下表所示。
属性类别 | 介绍 | 备注 |
---|---|---|
公有属性 | 类中和类外调用的属性 | 如果没有特别声明,变量默认为公有属性 |
私有属性 | 不能被类以外的函数调用的属性 | 命名以双下划线“__”开始的成员变量就是私有属性,可以通过类中函数访问,也可以通过instance._ClassName_attribute方式访问 |
内置属性 | 由系统在定义类的时候默认添加的 | 命名一般由前后两个下划线组成 |
class Person:
def __init__(self, name, age):
self.name = name
self._age = age # 单下划线开头的属性是类的内部实现细节
self.__address = None # 双下划线开头的属性是私有属性
def get_age(self):
return self._age
def set_address(self, address):
self.__address = address
def get_address(self):
return self.__address
person = Person("Tom", 20)
person.set_address("Beijing")
print(person.get_address()) # 输出 "Beijing"
print(person._Person__address) # 输出 "Beijing"
2.2类的方法
方法类别 | 介绍 | 备注 |
---|---|---|
公有方法 | 不能被类直接调用,需要通过实例化对象调用 | |
私有方法 | 不能被外部的类和方法调用,其定义和私有属性的定义相同 | 方法以双下划线“__”开头 |
类方法 | 能被类所调用,也能被对象调用 | 被classmethod函数调用或被@classmethod装饰器修饰的方法 |
静态方法 | 静态方法不与类或实例相关联,它是独立的函数,没有参数 self 或 cls 。静态方法可以通过类名或实例名来调用 | 静态方法使用 @staticmethod 装饰器来定义 |
2.2.1实例方法
实例方法(Instance Method):实例方法是最常见的一种方法,它与特定实例对象相关联,可以访问实例变量。实例方法的第一个参数必须是 self
,它表示实例对象本身,通过 self
可以访问实例属性和其他实例方法。例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"Hello, my name is {self.name}, and I'm {self.age} years old.")
person = Person("Tom", 20)
person.say_hello() # 输出 "Hello, my name is Tom, and I'm 20 years old."
2.2.2类方法
类方法是与类相关联的方法,它可以访问类变量,并且第一个参数是类本身,通常命名为 cls
。类方法可以通过 cls
来访问类属性和其他类方法。类方法使用 @classmethod
装饰器来定义。例如:
class Person:
count = 0
def __init__(self, name, age):
self.name = name
self.age = age
Person.count += 1
@classmethod
def get_count(cls):
return cls.count
person1 = Person("Tom", 20)
person2 = Person("Jane", 21)
print(Person.get_count()) # 输出 2
2.2.3静态方法
静态方法不与类或实例相关联,它是独立的函数,没有参数 self
或 cls
。静态方法可以通过类名或实例名来调用。静态方法使用 @staticmethod
装饰器来定义。例如:
class Calculator:
@staticmethod
def add(x, y):
return x + y
print(Calculator.add(1, 2)) # 输出 3
2.2.4特殊方法(魔法方法,魔术方法)
特殊方法是与类相关联的特殊方法,可以用于自定义类的行为。特殊方法以双下划线 __
开头和结尾,例如 __init__
、__str__
、__eq__
等。它们可以被 Python 解释器自动调用,例如在创建实例对象、使用 print
函数、比较对象等时。
Python 解释器会自动调用这些特殊方法,以完成相应的操作。例如,在创建实例对象时,Python 解释器会自动调用类的 __init__
方法;在使用 print
函数输出实例对象时,Python 解释器会自动调用类的 __str__
方法。这些特殊方法与一般的方法不同,它们不需要显式地调用,而是由 Python 解释器隐式地调用。
Python 解释器会根据特殊方法的名称和参数类型来确定何时调用它们。例如,在比较两个实例对象是否相等时,Python 解释器会自动调用类的 __eq__
方法,并将另一个实例对象作为参数传递给它。通过定义这些特殊方法,我们可以自定义类的行为,使其更符合我们的需求。
例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name='{self.name}', age={self.age})"
def __eq__(self, other):
return self.name == other.name and self.age == other.age
person1 = Person("Tom", 20)
person2 = Person("Tom", 20)
print(person1) # 输出 "Person(name='Tom', age=20)"
print(person1 == person2) # 输出 True
三.装饰器
在 Python 中,装饰器是一种函数或类,用于修改其他函数或类的行为。装饰器可以在不修改被装饰对象的源代码的情况下,动态地添加、修改或删除功能。装饰器通常用于实现代码复用、代码注入、日志记录、性能分析、授权验证等功能。
Python 中的装饰器使用 @decorator
语法来应用。例如,我们可以定义一个装饰器 my_decorator
,用于向函数添加一个前缀和后缀:
def my_decorator(func):
def wrapper():
print("Before function")
func()
print("After function")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello() # 输出: "Before function", "Hello!", "After function"
3.1静态方法
@staticmethod
是一个装饰器,用于定义静态方法。静态方法是一种不依赖于类实例或类本身的方法,可以在类中直接调用,也可以在类的实例中调用。静态方法通常用于实现不需要访问类或实例状态的工具函数或辅助函数。
在使用 @staticmethod
装饰器定义静态方法时,不需要传入 self
或 cls
参数,因为静态方法不依赖于对象实例或类本身。例如,我们可以定义一个 Math
类,并在其中定义一个静态方法 add
,用于计算两个数的和:
class Math:
@staticmethod
def add(x, y):
return x + y
# 通过类名直接调用静态方法
result = Math.add(2, 3)
print(result) # 输出: 5
# 通过类的实例调用静态方法
m = Math()
result = m.add(2, 3)
print(result) # 输出: 5
在这个例子中,add
是一个静态方法,不依赖于对象实例或类本身。可以通过类名直接调用 Math.add()
方法,也可以通过类的实例调用 instance.add()
方法。