Python--类

一、类的定义方法

在Python中,类可以通过关键字class来定义。类的定义包含在一个代码块中,并且通常以冒号:结尾。类的定义方法有以下几种:

1. 空类定义:

class MyClass:
    pass

这是一个最简单的类定义,类体中没有任何内容。

2. 带有属性和方法的类定义:

class MyClass:
    def __init__(self, name):
        self.name = name  # 属性
        
    # 方法
    def say_hello(self):
        print(f"Hello, my name is {self.name}.")

这个类定义了一个带有一个属性name和一个方法say_hello的类。__init__方法是一个特殊的方法,用于初始化对象的属性。

3. 继承父类:

class MyChildClass(MyParentClass):
    def __init__(self):
        super().__init__()

二、创建类的实例

所谓实例,是指类类型的变量。

  1. 如果类中定义了__init__方法,那么每当创建该类的实例时,__init__方法都会被自动调用。__init__方法通常用于初始化实例的属性。
class MyClass:
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

instance = MyClass(1, 2)  # 创建类的实例,自动调用__init__方法
print(instance.arg1)  # 输出: 1
print(instance.arg2)  # 输出: 2
  1. 如果类中没有定义__init__方法,那么创建类时会自动创建__init__方法,并在创建实例时自动调用。
class MyClass:
    pass

instance = MyClass()  # 创建类的实例时自动创建并调用__init__方法

上述两种方式都可以创建类的实例,但是通过__init__方法进行初始化更为常用和推荐,因为它能够自动在创建实例时完成初始化操作,避免了手动设置属性的繁琐和可能出现遗漏的情况。

三、创建类的成员

类的成员由实例方法和数据成员组成。
实例方法通常称为方法,数据成员称为属性。

所谓方法(或者实例方法)是指在类中定义的函数,数据成员(或者叫属性)是指在类中定义的变量。

例如:

class Student:
    def __init__(self, name, age, score):
    	# self.name,self.age,self.score是数据成员(或者叫属性)
        self.name = name
        self.age = age
        self.score = score

	# introduce函数是Student的方法
    def introduce(self):
        print(f"姓名:{self.name}")
        print(f"年龄:{self.age}")
        print(f"成绩:{self.score}")

# 创建一个学生实例
student = Student("张三", 18, 90)

# 调用实例方法,介绍学生信息
student.introduce()

1、创建属性

属性分为类属性和实例属性。

创建类属性

类属性是同一个类的所有实例共享的属性。它们可以在类的定义中直接创建,并且对于同一个类的所有类的实例来说,它们的值是相同的。

例如:

class MyClass:
    class_attribute = 1

instance1 = MyClass() # 创建实例1
instance2 = MyClass() # 创建实例2

print(instance1.class_attribute)  # 输出: 1
print(instance2.class_attribute)  # 输出: 1

通过上例可以看到,MyClass类的两个不同实例instance1instance2共同享有类属性class_attribute

注意:类属性可以通过类名.属性名或者实例名.属性名的方法访问。

例如:

class MyClass:
    class_attribute = 1

instance = MyClass() # 创建实例

print(MyClass.class_attribute)    # 通过类名访问。输出: 1
print(instance.class_attribute)  # 通过实例名访问。输出: 1

创建实例属性

实例属性是每个类实例特有的属性。它们可以在类的初始化方法(__init__)中使用 self 关键字创建,并且每个实例的实例属性的值可以是不同的。

class MyClass:
    def __init__(self):
        self.instance_attribute = 2

my_object = MyClass()
print(my_object.instance_attribute)  # 输出: 2

实例属性也可以在类的其他方法中创建和使用。

class MyClass:
    def __init__(self):
        self.instance_attribute = 2

    def print_attribute(self):
        print(self.instance_attribute)

my_object = MyClass()
my_object.print_attribute()  # 输出: 2

注意,实例属性对每个实例都是唯一的,每个实例都有自己的实例属性副本。而类属性是类的属性,所有的实例共享同一个类属性。实例属性只能通过实例.属性名访问。

2、创建方法

Python类的方法是在类内部定义的函数。它们用于定义类的行为和操作。类的方法可以访问和操作类的属性,也可以调用其他方法。

实例方法

实例方法是类中定义的普通方法。它们的第一个参数通常被命名为self,表示对当前实例对象的引用。通过这个参数,实例方法可以访问和操作当前对象的属性。

class MyClass:
    def __init__(self, x):
        self.x = x
    
    def my_method(self):
        print(self.x)

my_instance = MyClass(10)
my_instance.my_method()  # 输出:10

类方法

类方法是在类级别定义的方法,使用@classmethod装饰器进行标识。类方法的第一个参数通常被命名为cls,表示对当前类的引用。类方法可以访问和修改类的属性,也可以调用其他类方法。

class MyClass:
    x = 0
    
    @classmethod
    def my_class_method(cls):
        cls.x += 1
        print(cls.x)

MyClass.my_class_method()  # 输出:1
MyClass.my_class_method()  # 输出:2

这是类方法的一个例子,其中类属性x被逐次递增。

四、类成员的访问权限

在Python中,可以使用下划线来表示成员的访问权限。有两种下划线的使用方式,分别是单下划线(保护权限:protected)和双下划线(私有权限:private)。

1、保护属性成员

  1. 单下划线(_):表示成员是受保护的,约定成员应该被视为非公开的,不应该直接访问。但实际上,Python并不会强制限制对受保护成员的访问,只是通过命名约定来提醒开发者不要直接访问这些成员。

例如:

class MyClass:
    _protected_member = 10 # 保护属性成员
        
    def print_protected_member(self):
        print(self._protected_member)

my_object = MyClass()
my_object.print_protected_member()  # 通过实例方法访问保护类型成员。输出:10
print(my_object._protected_member)  # 通过实例访问保护类型成员。输出:10(不推荐直接访问)
print(MyClass._protected_member)    # 通过类名访问保护类型成员。输出:10

# 输出:
10
10
10

保护类型的成员,允许类本身子类实例直接访问,但不能使用from module import *导入。

2、私有属性成员

双下划线(__):表示成员是私有的,只能在类的内部访问,无法从外部直接访问。这样的成员可以防止子类中的命名冲突。

例如:

class MyClass:
    __protected_member = 10 # 私有属性成员
        
    def __init__(self):
        print(MyClass.__protected_member) # 实例方法中访问私有属性成员

my_object = MyClass()
print(my_object._MyClass__protected_member)  # 通过“实例名._类名__成员名”访问私有属性。

# 输出:
10
10

需要注意的是,Python中的私有成员实际上是经过了名称重整(name mangling)的,在名称前会加上一个下划线和类名,所以无法直接访问。如果想在外部访问私有成员,可以通过实例名._类名__成员名的方式访问,但这种方式不推荐使用。

五、装饰器

用法1:

在Python中,可以通过@property(装饰器)将一个方法转为属性,从而可以实现直接使用方法名来访问方法,而不需要再添加一对小括号,这样可以使得代码更加简洁。

例如:

class Rect():
    def __init__(self, width, height):
        self.width = width
        self.height = height

    @property
    def area(self):
        return self.width * self.height

rect = Rect(800, 600)
print("面积为:", rect.area)

# 输出
面积为: 480000

用法2:

在Python中,默认情况下,创建的类属性或者实例是可以在类体外修改的,如果要想限制其不能在类体外修改,可以将其设置为私有的,但设置为私有的之后又不能在类体外访问。如果要创建一个可以读取,但不能修改的属性,可以使用@property实现只读属性。

例如:

class MyClass():
    def __init__(self):
        self.__private_attribute = 10 		# 私有属性
        
    @property                         		# 将方法转为属性
    def print_attribute(self):        		# 定义方法
        return self.__private_attribute  	# 返回私有属性的值

instance = MyClass()  						# 创建实例
print(instance.print_attribute)  			# 获取私有属性的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值