1.两大编程思想
面向对象(python和java)和面向过程(c语言)编程思想的区别
2.类和对象
1.类是抽出对象中的相似属性和行为得到的类别
python中一切皆对象
对于字符串,整数等等都是类型class
可以自定义class,需要注意类型名称首字母大写
2.创建类,创建对象结构:
类的组成:
实例属性和实例方法的调用需要用对象名.来调用,其他和实例无关的类的相关组成通过类名来调用
- 类属性
类属性是定义在类命名空间中的变量,它被类的所有实例共享。这意味着,无论你创建了多少个类的实例,它们访问的都是同一个类属性。类属性通常用于那些与类本身紧密相关,但与类的具体实例无关的数据。 - 实例属性 实例属性是定义在实例命名空间中的变量,每个实例都有自己独立的实例属性,互不干扰。实例属性通常用于存储与类的特定实例相关的数据。
- 定义实例属性
实例属性通常在类的__init__方法中定义,使用self作为前缀。
class MyClass:
# 类属性
class_attribute = "这是一个类属性"
def __init__(self, instance_attribute): #实例方法
# 实例属性
self.instance_attribute = instance_attribute
# 访问类属性
print(MyClass.class_attribute) # 输出: 这是一个类属性
# 修改类属性(会影响所有实例)
MyClass.class_attribute = "类属性已修改"
print(MyClass.class_attribute) # 输出: 类属性已修改
# 创建实例
instance1 = MyClass("实例属性1")
instance2 = MyClass("实例属性2")
# 访问实例属性
print(instance1.instance_attribute) # 输出: 实例属性1
print(instance2.instance_attribute) # 输出: 实例属性2
# 修改实例属性(不会影响其他实例)
instance1.instance_attribute = "实例属性1已修改"
print(instance1.instance_attribute) # 输出: 实例属性1已修改
print(instance2.instance_attribute) # 输出: 实例属性2(未变)
总结
类属性:定义在类命名空间中,被类的所有实例共享。
实例属性:定义在实例命名空间中,每个实例都有自己独立的实例属性。
- 实例方法
实例方法通过在类定义中直接编写函数来定义,但该函数至少接受一个名为self的参数(虽然在调用实例方法时不需要显式传递self参数,Python会自动处理)。
在下边这个例子中,__init__方法是一个特殊的实例方法,用于初始化新创建的实例。它自动接受self作为第一个参数,尽管在创建实例时不需要显式传递它。
class MyClass:
def __init__(self, value):
self.value = value
def print_value(self):
# 访问实例属性
print(self.value)
def modify_value(self, new_value):
# 修改实例属性
self.value = new_value
# 创建实例
instance = MyClass(5)
# 调用实例方法
instance.print_value() # 输出: 5
instance.modify_value(10)
instance.print_value() # 输出: 10
- 静态方法
在Python中,静态方法(Static Methods)是定义在类中的函数,但它既不接受类隐式的第一个参数(cls对于类方法而言),也不接受实例隐式的第一个参数(self对于实例方法而言)。静态方法实际上与普通函数的行为相似,但它们在类的命名空间中定义,这意味着你可以通过类来引用它们,而不是必须定义在全局作用域中。
静态方法主要用于那些逻辑上属于类的范畴,但实际上既不需要访问类属性也不需要访问实例属性的函数。
静态方法通过@staticmethod装饰器来定义。
class MyClass:
@staticmethod
def my_static_method(arg1, arg2):
# 注意:没有self或cls参数
print(f"Static method called with arguments: {arg1}, {arg2}")
# 调用静态方法
MyClass.my_static_method(1, 2) # 通过类名调用
# 也可以通过实例调用,但这样做通常不是必需的
instance = MyClass()
instance.my_static_method(3, 4) # 通过实例调用
使用场景:
静态方法的一个常见用途是实现工具函数,这些函数虽然与类紧密相关,但不需要访问类的任何属性。例如,你可能有一个表示几何形状的类,该类有一个静态方法来计算给定类型的形状是否可以被另一个形状完全包含(如一个圆是否完全位于另一个圆内)。这样的计算不需要访问任何实例或类属性,因此将其实现为静态方法是合适的。
- 类方法
在Python中,类方法(Class Methods)是绑定到类而不是类的实例的方法。它们至少接受一个参数,按照惯例,这个参数被命名为cls,它是对类本身的引用,而不是类的实例。类方法通过@classmethod装饰器来定义。
**类方法通常用于实现那些需要访问类属性或执行与类本身相关的操作,但不需要访问或修改实例属性的功能。**一个常见用途是实现工厂方法模式,即类方法根据输入参数返回类的不同实例。另一个用途是修改或访问类级别的状态。
class MyClass:
counter = 0 # 类属性
@classmethod
def get_counter(cls):
# 注意:这里使用cls而不是self
return cls.counter
静态方法与实例方法和类方法的区别
实例方法:接受一个隐式的self参数,通过该参数可以访问类的实例属性和其他实例方法。
类方法:接受一个隐式的cls参数,代表类本身,通过它可以访问类属性,但不能直接访问实例属性(因为没有self参数指向具体的实例)。
静态方法:不接受隐式的self或cls参数,它更像是一个放在类命名空间中的普通函数。
给对象动态绑定属性和函数
在对象创建后再写入
动态函数写好后赋值给对象,需要注意不要加()错写成调用。