python类属性、实例属性;类要领、实例要领,静
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 Bron", 35)
# 访问实例属性
print(prof1.name) # "John Smith"
print(prof2.name) # "Mary Bron"
在上面的代码中,我们创建了两个不同的教授对象prof1和prof2,分别将它们的name属性设置为John Smith和Mary Bron。通过实例名来访问实例属性。
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, ne_dept):
cls.department = ne_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, ne_dept):
cls.department = ne_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 beteen {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
奇闻怪事
- 黎姿老公马廷强前妻 黎姿老公马廷强前妻是谁
- 紫禁城闹鬼是真的吗 紫禁城闹鬼是怎么回事
- 80年黄河透明棺材事件 80年代黄河透明棺材始末
- 51区外星人录像是真的吗 51区外星人真的存在吗
- 姜潮麦迪娜恋爱过程 姜潮麦迪娜怎么认识的
- 根达亚文明大概离现在多久 根达亚文明距今多少
- 赤塔事件真的还是假的 赤塔事件到底怎么回事
- 百慕大三角在哪个国家 百慕大三角在哪个国家的
- 邓超出轨安以轩:邓超出轨安以轩是不是真的
- 中国十大闹鬼最凶的地方 中国十大闹鬼最凶的地
- 湘西鬼结婚事件:湘西鬼结婚事件真假
- 中国昆仑山10大灵异绝密档案 中国昆仑山10大灵异
- 李维嘉的父亲是谁 李维嘉父母是哪里人
- 朱秀华事件是不是真的 朱秀华事件的真相是什么
- 太湖冤魂:太湖冤魂事件真假
- 爪哇虎和东北虎谁厉害 爪哇虎和东北虎谁厉害一