python进阶——1.python中类,对象,装饰器详解

一.对象

        在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() 方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小百里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值