首页 > 编程语言 >python 类与对象

python 类与对象

时间:2023-05-01 10:22:16浏览次数:33  
标签:__ name python self Dog 对象 def 属性

在Python中,类是一种用户自定义的数据类型,代表着一组具有相同属性和方法的对象。属性是类或实例所拥有的变量,用于描述该对象的特征或状态。

一个生活中的例子可以是汽车制造。汽车制造过程中,我们需要设计一个Car类,这个类包含属性(例如颜色,品牌,车型等)和方法(例如启动引擎,前进,刹车等)。每辆汽车都是由这个类作为蓝图来创建的实例,并且每个实例都有其自己的属性(例如独特的车牌号码)以及方法,它们可以执行与其他汽车不同的操作(例如在另一个地方停车)。

例如,在下面的代码中,我们定义了一个Person类,它有两个属性name和age,以及一个方法speak:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):
        print("Hello, my name is", self.name, "and I am", self.age, "years old.")

通过这个类,我们可以创建多个Person对象,每个对象都有自己的name和age属性,并且可以使用speak方法打印出对象的信息:

person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

person1.speak()  # 输出:Hello, my name is Alice and I am 25 years old.
person2.speak()  # 输出:Hello, my name is Bob and I am 30 years old.

因此,类和属性可以帮助我们在代码中组织数据,并将其用于某个特定的目的。

在Python中,类还可以通过继承来获得其他类的特性。继承是一种面向对象编程的概念,它允许我们创建一个新的类,并从现有的类中继承方法和属性,这些继承的属性可以在新类中被重写或扩展。

例如,假设我们要创建一个Student类,在Person类的基础上扩展它,我们可以使用以下代码:

class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade

    def speak(self):
        print("Hello, my name is", self.name, "and I am a student in grade", self.grade)

在这个例子中,我们定义了一个Student类,它继承了Person类,并添加了一个额外的属性grade,以及一个新的speak()方法,用于打印学生的信息。

然后,我们可以创建多个Student对象,并调用它们的方法:

student1 = Student("Alice", 17, "11th")
student2 = Student("Bob", 18, "12th")

student1.speak()  # 输出:Hello, my name is Alice and I am a student in grade 11th.
student2.speak()  # 输出:Hello, my name is Bob and I am a student in grade 12th.

通过继承,我们可以减少代码的书写量,同时还可以使代码更具可读性和可维护性。

在Python中,属性可以分为实例属性和类属性。实例属性是属于对象的变量,每个对象都有它们自己的值。而类属性是属于类的变量,它们在所有对象之间共享相同的值。

例如,我们可以定义一个Dog类,其中包含一个实例属性name和一个类属性species:
class Dog:
    species = "mammal"

    def __init__(self, name):
        self.name = name

在这个例子中,species是一个类属性,它的值对于所有创建的Dog对象都是相同的。而name是一个实例属性,每个Dog对象都有自己的name值。

我们可以创建多个Dog对象,并访问它们的属性:

dog1 = Dog("Buddy")
dog2 = Dog("Milo")

print(dog1.name)  # 输出:Buddy
print(dog2.name)  # 输出:Milo

print(dog1.species)  # 输出:mammal
print(dog2.species)  # 输出:mammal

通过这种方式,我们可以使用类属性来定义一些通用的特性,并使用实例属性来存储每个对象的独特信息。

总之,在Python中,类和属性是面向对象编程的核心概念之一。通过类,我们可以定义自己的数据类型,并在程序中创建多个对象。通过属性,我们可以描述对象的特征、状态和行为。如果您要进行面向对象编程,那么理解类和属性的概念是非常重要的。

另外,在Python中,属性可以通过@property和@setter装饰器来控制对其的访问。这些装饰器提供了一种简单的方式,使我们能够在属性被访问时自动触发某些操作。

例如,我们可以为Dog类添加一个weight实例属性,并使用@property和@setter来限制它的值必须是正数:

class Dog:
    species = "mammal"

    def __init__(self, name, weight):
        self.name = name
        self._weight = weight

    @property
    def weight(self):
        return self._weight

    @weight.setter
    def weight(self, value):
        if value > 0:
            self._weight = value
        else:
            raise ValueError("Weight must be positive")

在这个例子中,weight是一个实例属性,并且在getter方法上使用@property装饰器,setter方法上使用@setter装饰器。这样,当我们尝试设置一个负数的weight值时,会抛出ValueError异常。

我们可以创建一个Dog对象,并尝试访问和修改它的weight属性:

dog = Dog("Buddy", 10.5)
print(dog.weight)  # 输出:10.5

dog.weight = 12.3
print(dog.weight)  # 输出:12.3

dog.weight = -1  # 抛出异常:ValueError: Weight must be positive

通过这种方式,我们可以轻松地控制属性的访问和修改,并保证其符合一定的规则和逻辑。

除了@property和@setter之外,在Python中还有一些其他的装饰器,可以帮助我们自定义类的行为。例如:

  • @classmethod:用于定义一个类方法,类方法是作用于整个类而不是实例的方法。
  • @staticmethod:用于定义一个静态方法,静态方法与类和实例没什么关系,只是在类中定义的函数。
  • @abstractmethod:用于定义一个抽象方法,抽象方法是没有具体实现的方法,需要在子类中重新定义实现。

这些装饰器提供了一种简单的方式,使我们能够自定义类的行为,并在子类中重写或扩展它们。

例如,我们可以为Animal类添加一个静态方法get_species(),并为Dog类添加一个类方法bark()和一个抽象方法speak():

from abc import ABC, abstractmethod

class Animal(ABC):
    @staticmethod
    def get_species():
        return "Unknown"

    @abstractmethod
    def speak(self):
        pass


class Dog(Animal):
    species = "mammal"

    @classmethod
    def bark(cls):
        print("Woof!")

    def speak(self):
        print("Bark!")


class Cat(Animal):
    species = "mammal"

    def speak(self):
        print("Meow")

    @staticmethod
    def get_species():
        return "Felis catus"

在这个例子中,Animal类继承了ABC类,并使用@abstractmethod装饰器定义了一个抽象方法speak()。Dog类继承了Animal类,并使用@classmethod装饰器定义了一个类方法bark()。Cat类同样继承了Animal类,并使用@staticmethod装饰器定义了一个静态方法get_species()。

我们可以创建多个Dog和Cat对象,并调用它们的方法:

dog = Dog()
dog.bark()   # 输出:Woof!
dog.speak()  # 输出:Bark!

cat = Cat()
print(cat.get_species())  # 输出:Felis catus
cat.speak()  # 输出:Meow

通过这种方式,我们可以自定义类的行为,并在子类中重写或扩展它们,从而使代码更加灵活、可复用和可扩展。

此外,在Python中,类可以具有特殊的方法,例如__init__()、str()、repr()和__eq__()等。这些特殊的方法通常被称为魔术方法或特殊方法,它们重写了内置函数和运算符的默认行为。

例如,init()方法在创建对象时被调用,并用于初始化对象的属性。str()方法用于返回对象的字符串表示形式,repr()方法用于返回对象的“官方”字符串表示形式,而__eq__()方法用于比较两个对象是否相等。

以下是一个示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name} ({self.age})"

    def __repr__(self):
        return f"Person('{self.name}', {self.age})"

    def __eq__(self, other):
        if isinstance(other, Person):
            return self.name == other.name and self.age == other.age
        return False

在这个例子中,我们定义了一个Person类,并重写了它的__init__()、str()、repr()和__eq__()方法。init()方法用于初始化对象的属性,str()和__repr__()方法用于返回不同的字符串表示形式,eq()方法用于比较两个对象是否相等。

我们可以创建多个Person对象,并调用它们的方法:

person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

print(person1)  # 输出:Alice (25)
print(repr(person1))  # 输出:Person('Alice', 25)

person3 = eval(repr(person1))
print(person1 == person3)  # 输出:True

通过这种方式,我们可以重写类的特殊方法,并改变默认的行为。这使得我们能够更好地控制对象的创建、比较和输出等操作。

最后,需要提到的是Python中的继承和多态。继承使得一个类可以从另一个类中继承属性和方法,并在此基础上添加新的属性和方法。这样,我们就可以构建一个层次结构,并将相似的对象分组在一起。

多态是面向对象编程中的另一个重要概念,它允许子类对象以不同的方式对待共同的父类对象。这意味着我们可以使用相同的函数来处理不同的对象,并且这些对象可以具有不同的行为。

例如,我们可以创建一个Animal类和两个子类Dog和Cat,然后使用一个函数feed_pet()来喂养这些动物:

class Animal:
    def __init__(self, name):
        self.name = name

    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("Bark!")

class Cat(Animal):
    def make_sound(self):
        print("Meow")

def feed_pet(pet):
    print(f"Feeding {pet.name}...")
    pet.make_sound()

dog = Dog("Buddy")
cat = Cat("Fluffy")

feed_pet(dog)  # 输出:Feeding Buddy... Bark!
feed_pet(cat)  # 输出:Feeding Fluffy... Meow

在这个例子中,Animal是一个父类,而Dog和Cat是两个子类,它们都重写了父类中的make_sound()方法。然后,我们定义了一个feed_pet()函数,并将Dog和Cat对象作为参数传递给它。该函数会调用pet对象的make_sound()方法,从而实现不同的行为。

通过这种方式,我们可以使用相同的函数来处理不同的对象,并且这些对象可以具有不同的行为和属性。这是面向对象编程中非常重要的概念,使得我们能够构建可复用、可扩展、易于维护的程序。

标签:__,name,python,self,Dog,对象,def,属性
From: https://www.cnblogs.com/yund/p/17366227.html

相关文章

  • 【python】if __name__=='__main__'
    当我们想一个python文件作为脚本直接执行时才执行某段代码,而被其他python文件调用时不执行那段代码,就可以通过if__name__=='__main__'实现。if__name__=='__main__'只有在python文件作为脚本执行时才为True。python文件直接执行时__name__值为'__main__',被别的文件调用......
  • 理解对象
    目录1.理解对象1.1属性的类型1.1.1数据属性CEWV1.1.1.2修改与访问数据属性1.1.1.2.1修改属性的默认特性1.1.1.2.2访问数据属性1.1.2访问器属性1.1.3合并对象——Object.assign()1.1.4对象标识与相等判定——Object.is()1.1.5增强的对象语法1.1.6对象解构1.解构......
  • Python 3 alias All In One
    Python3aliasAllInOnepython3/py3/python#$vim.zshrc$code.zshrc$source~/.zshrc$py3--versionPython3.9.6$python--versionPython3.9.6$python3--versionPython3.9.6$whichpy3py3:aliasedtopython3$whichpythonpython......
  • python操作MongoDB数据库
    python处理mongodb首选就是pymongo.首先,安装一下这个模块pipinstallpymongo建立连接importpymongoconn=pymongo.MongoClient(host='localhost',port=27017)#切换数据库py=conn['python']#登录该数据库(需要的话)py.authenticate("python_admin",'......
  • python 列表推导式
    Python列表推导式是一种简洁而强大的语法结构,可以让你更快地创建、转换和过滤Python列表。它在Python中非常常用,并且是Python程序员必须掌握的技能之一。具体而言,列表推导式是使用一行代码创建新列表的方法。这个代码行由三部分组成:表达式、迭代器和可选的过滤器。表达式是一个......
  • python 文件操作(csv和excel大型文件读取)
    使用csv模块首先,我们需要导入csv模块:importcsv读取CSV文件要读取一个CSV文件,可以使用csv.reader()函数。该函数接受一个文件对象作为参数,并返回一个可迭代的行列表。每一行都是一个由列数据组成的列表。例如,如果我们有一个名为data.csv的CSV文件,其中包含以下内容:Name,Age......
  • python 文件操作
    在Python3中,进行文件操作的主要方式是使用内置的open()函数。该函数接受一个文件名和一个模式参数,并返回一个文件对象,我们可以在该对象上执行读取或写入操作。以下是一些常见的文件操作及其示例:打开文件我们可以使用open()函数打开一个文件并获得文件对象。例如,以下代码......
  • OOP面向对象第二个月学习总结
    OOP面向对象第二个月学习总结目录 · 前言 · 设计与分析 · 踩坑心得 · 改进建议 · 总结 一、前言这个月的学习相比上个月的学习,难度就提升了极多,为了让我们更好的理解面向对象的几个特点和原则,题目以及作业的难度,复杂度,综合性增加了许多。主要有几次实验,......
  • 面向对象程序设计题目集总结blog2-22206110-胡瑞杰
    一、前言第二次在博客园上发布面向对象程序设计题目集的总结博客。经过几周的学习,面向对象的理念更加深入。虽然已经学了些面向对象程序设计,学好这部分内容还是有较大难度。关于知识点本次的题目集所体现的知识点已经不仅限于Java的语法知识,还需要考虑设计问题,不......
  • android之间传递多个对象  IPC也是…
    第一步:新建一个Android工程命名为ObjectTranDemo(类比较多哦!)目录结构如下图: 第二步:修改main.xml布局文件(这里我增加了两个按钮)代码如下<?xmlversion="1.0"encoding="utf-8"?>  <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"an......