python类属性、实例属性;类方法、实例方法,静态方法

1、类属性:属于类本身而不是类的实例。可以使用类名或者实例名来访问。对于所有的实例来说,类属性的值是相同的,且在类的所有实例中是共享的

class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def introduce(self):
        print(f"Hello, my name is {self.name}, and I am {self.age} years old.")

# 访问类属性
print(Professor.department)  # "Computer Science"

# 创建教授对象
prof = Professor("John Smith", 40)

# 访问类属性
print(prof.department)  # "Computer Science"

在上面的代码中,我们使用类名或者实例名来访问department类属性,两种方式都可以得到相同的结果,即"Computer Science"。

2、实例属性:属于类的实例,只能通过实例名来访问。对于每个实例来说,实例属性的值是不同的,且在不同实例中是不共享的。

class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def introduce(self):
        print(f"Hello, my name is {self.name}, and I am {self.age} years old.")

# 创建教授对象
prof1 = Professor("John Smith", 40)
prof2 = Professor("Mary Brown", 35)

# 访问实例属性
print(prof1.name)  # "John Smith"
print(prof2.name)  # "Mary Brown"

在上面的代码中,我们创建了两个不同的教授对象prof1和prof2,分别将它们的name属性设置为John Smith和Mary Brown。通过实例名来访问实例属性

3、类方法:与类本身相关的方法,使用@classmethod装饰器来定义。类方法的第一个参数通常为cls,表示类本身,可以使用类名或者实例名来调用,类方法可以访问和修改类属性,但不能访问实例属性

class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def introduce(self):
        print(f"Hello, my name is {self.name}, and I am {self.age} years old.")

    # 类方法
    @classmethod
    def change_department(cls, new_dept):
        cls.department = new_dept

# 访问类属性
print(Professor.department)  # "Computer Science"
prof1 = Professor("John Smith", 40)
prof2 = Professor("Jane Doe", 35)
# 调用类方法# 调用类方法来修改类属性
Professor.change_department("Mathematics")


print(prof1.department)  # Mathematics
print(prof2.department)  # Mathematics

在上面的代码中,我们使用类名调用了change_department类方法将department类属性的值从"Computer Science"修改为"Mathematics"。可以发现,这个修改是在所有的实例中都生效的。

4、实例方法:与类的实例相关的方法,使用类中的方法来定义,第一个参数通常为self,表示调用该方法的实例。只能使用实例名来调用

class Professor:
    # 类属性
    department = "Computer Science"

    # 实例属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def introduce(self):
        print(f"Hello, my name is {self.name}, and I am {self.age} years old.")

    # 类方法
    @classmethod
    def change_department(cls, new_dept):
        cls.department = new_dept

    # 实例方法
    def retire(self):
        print(f"{self.name} is retiring.")
        self.age = 65

# 创建教授对象
prof = Professor("John Smith", 40)

# 调用实例方法
prof.retire()  # "John Smith is retiring."
print(prof.age)  # 65

在上面的代码中,我们调用了retire实例方法,将prof对象的age属性从40修改为65。只能使用实例名来调用实例方法

5、静态方法(staticmethod),它与类和实例都没有直接的关联,它们只是存在于类的命名空间中。静态方法是使用@staticmethod装饰器来定义的,它没有默认的参数,也不需要使用cls或self参数。静态方法主要用于与类相关的工具函数,它们没有默认的参数,也不需要使用cls或self参数。在使用时,我们可以使用类名或实例名来调用静态方法,而不需要创建实例对象。静态方法可以访问类属性,但不能访问实例属性,因为它们没有cls或self参数。

eg.1 以教授类例子中,我们可以定义一个静态方法来计算两个教授之间的年龄差距。

class Professor:
    # 类属性
    university = "MIT"

    def __init__(self, name, age, title, department):
        # 实例属性
        self.name = name
        self.age = age
        self.title = title
        self.department = department

    def greet(self):
        print(f"Hello, my name is {self.name}.")

    @staticmethod
    def distance(prof1, prof2):
        # 计算两个教授之间的距离
        return abs(prof1.age - prof2.age)

# 创建两个教授对象
prof1 = Professor("John Smith", 50, "Professor", "Computer Science")
prof2 = Professor("Alice Johnson", 45, "Associate Professor", "Electrical Engineering")

# 调用静态方法计算两个教授之间的距离
distance = Professor.distance(prof1, prof2)
print(f"The distance between {prof1.name} and {prof2.name} is {distance} years.")

我们定义了一个distance静态方法,它接受两个教授对象作为参数,并计算它们之间的年龄差。该方法与教授类相关,但不依赖于类的实例,因此我们使用静态方法来实现。我们可以使用类名来调用该方法,例如Professor.distance(prof1, prof2)。由于该方法没有访问实例属性,因此不需要使用self参数。

eg.2以教授为例,如何使用类名或实例名来调用静态方法。

假设我们已经定义了一个教授类Professor,并且在该类中定义了一个静态方法calculate_salary,用于计算教授的工资

class Professor:
    # 类属性
    university = "MIT"

    def __init__(self, name, age, title, department, salary):
        # 实例属性
        self.name = name
        self.age = age
        self.title = title
        self.department = department
        self.salary = salary

    def greet(self):
        print(f"Hello, my name is {self.name}.")

    @staticmethod
    def calculate_salary(salary):
        # 计算教授的工资
        tax_rate = 0.2  # 税率为20%
        tax = salary * tax_rate
        return salary - tax
# 使用类名调用静态方法
#XXXXXXXXXXXXXXXXXXXXXXXXXXXX
salary = Professor.calculate_salary(100000)
print(f"The actual salary is {salary}.")
# 使用实例名调用静态方法
#XXXXXXXXXXXXXXXXXXXXXXXXXXXX
# 创建一个教授实例
professor = Professor("John Smith", 50, "Professor", "Computer Science", 120000)
salary = professor.calculate_salary(120000)
print(f"The actual salary is {salary}.")

A、使用Professor.calculate_salary(100000)来调用静态方法,计算工资为100000的教授的实际工资,B、创建了一个教授实例professor,然后使用professor.calculate_salary(120000)来调用静态方法,计算该教授的实际工资。由于静态方法不依赖于类的实例,因此我们可以使用实例名或类名来调用该方法,两者的效果是一样的。

总之,静态方法可以使用类名或实例名来调用,两者的效果是一样的。在某些情况下,使用实例名调用静态方法可能更加直观和易于理解。

6、静态方法主要与类相关的工具函数

6.1 工具函数:比如math库中的sqrt()方法,用于计算平方根。可以定义一个类方法,用于计算多个数的平方根。

import math

class Calculator:
    @staticmethod
    def calculate_squares(*args):
        squares = []
        for num in args:
            squares.append(math.sqrt(num))
        return squares

print(Calculator.calculate_squares(16, 25, 36)) # [4.0, 5.0, 6.0]

6.2 创建辅助实例或对象:比如创建配置对象,可以定义一个静态方法,用于根据给定的配置文件路径,返回一个配置对象。

class Config:
    def __init__(self, config_path):
        # Load and parse the configuration file
        pass

    # Instance method to get a configuration value
    def get_value(self, key):
        # Return the value of the given key
        pass

    @staticmethod
    def load_from_file(config_path):
        return Config(config_path)

config = Config.load_from_file('config.ini')
value = config.get_value('key')

6.3管理或访问类的状态:比如跟踪类实例的数量,可以定义一个静态属性来记录类实例的数量,再定义一个静态方法,用于返回实例数量。

class Person:
    instance_count = 0

    def __init__(self, name):
        self.name = name
        Person.instance_count += 1

    @staticmethod
    def get_instance_count():
        return Person.instance_count

person1 = Person('Alice')
person2 = Person('Bob')
print(Person.get_instance_count()) # 2
展开阅读全文

页面更新:2024-04-01

标签:静态   实际工资   实例   属性   方法   定义   教授   对象   参数   两个

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top