您的位置 首页 > 数码极客

(pythoncharm)pythoncharm怎么设置中文

  • Object-Oriented Programming
  • Classes
  • raise
  • Decorators
  • Connecting to Previous Work in this Course
  • Class Methods
  • Static Methods
  • Inheritance
  • Inheritance and Exceptions
  • Operator Overloading
  • Summing Up

Object-Oriented Programming


  • 编程有不同的范式。当你学习其他语言时,你会开始认识到像这样的模式。
  • 到目前为止,你已经按照程序一步一步地完成了工作。
  • 面向对象编程(OOP)是解决编程相关问题的一种引人注目的解决方案。
  • 要开始,请键入code 并编写如下代码:
name = input("Name: ") house = input("House: ") print(f"{name} from {house}") Copy

请注意,此程序遵循一个程序性的逐步范例:这与你在本课程前面部分中看到得非常相似.

  • 利用我们前几周的工作,我们可以创建函数来抽象出程序的一部分。
def main(): name = get_name() house = get_house() print(f"{name} from {house}") def get_name(): return input("Name: ") def get_house(): return input("House: ") if __name__ == "__main__": main()

请注意get_name 和get_house 是如何抽象出我们main函数的一些需求的。此外,请注意上面代码的最后几行是如何告诉编译器运行main 函数的。

  • 我们可以通过将学生存储为tuple来进一步简化程序。tuple 是一个值序列。不像list,tuple 无法修改。实际上,我们将返回两个值。
def main(): name, house = get_student() print(f"{name} from {house}") def get_student(): name = input("Name: ") house = input("House: ") return name, house if __name__ == "__main__": main()

请注意get_student 返回name, house。

  • 包装说明tuple,这样我们就可以将这两个项目都返回给名为student,我们可以修改我们的代码如下。
def main(): student = get_student() print(f"{student[0]} from {student[1]}") def get_student(): name = input("Name: ") house = input("House: ") return (name, house) if __name__ == "__main__": main()

请注意,(name, house) 显式地告诉任何阅读我们代码的人,我们返回的是一个值中的两个值。tuples使用student[0] 或student[1]。

  • tuples是不可变的,这意味着我们不能改变这些值。不可变性是一种我们可以防御性地编程的方式。
def main(): student = get_student() if student[0] == "Padma": student[1] = "Ravenclaw" print(f"{student[0]} from {student[1]}") def get_student(): name = input("Name: ") house = input("House: ") return name, house if __name__ == "__main__": main()

请注意,这段代码会产生一个错误。tuple的值是不可变的,因此我们无法重新分配student[1]。

  • 如果我们想为我们的程序员同事提供灵活性,我们可以利用list 如下所示。
def main(): student = get_student() if student[0] == "Padma": student[1] = "Ravenclaw" print(f"{student[0]} from {student[1]}") def get_student(): name = input("Name: ") house = input("House: ") return [name, house] if __name__ == "__main__": main()

注意,列表是可变的。house 和name 可以由程序员切换。在某些情况下,如果希望以牺牲代码的安全性为代价来提供更大的灵活性,你可能会决定使用这种方法。毕竟,如果这些值的顺序是可更改的,那么与你一起工作的程序员可能会犯错误。

  • 在这个实现中也可以使用字典。回想一下,字典提供了一个键-值对。
def main(): student = get_student() print(f"{student['name']} from {student['house']}") def get_student(): student = {} student["name"] = input("Name: ") student["house"] = input("House: ") return student if __name__ == "__main__": main()

注意,在这个例子中,返回了两个键-值对。这种方法的一个优点是我们可以使用键来索引这个字典。

  • 不过,我们的代码还可以进一步改进。注意,有一个不需要的变量。我们可以删除student = {} 因为我们不需要创建一个空字典。
def main(): student = get_student() print(f"{student['name']} from {student['house']}") def get_student(): name = input("Name: ") house = input("House: ") return {"name": name, "house": house} if __name__ == "__main__": main()

注意我们可以利用{} 中的大括号return 语句创建词典并在同一行中返回所有词典。

  • 我们可以在代码的字典版本中提供Padma的特殊情况。
def main(): student = get_student() if student["name"] == "Padma": student["house"] = "Ravenclaw" print(f"{student['name']} from {student['house']}") def get_student(): name = input("Name: ") house = input("House: ") return {"name": name, "house": house} if __name__ == "__main__": main()

请注意,与前面的代码迭代类似,我们可以利用键名在学生字典中建立索引。

Classes


  • 在面向对象编程中,类是一种创建自己的数据类型并给予命名的方法。
  • 一个类就像一个数据类型的模型--在这里我们可以发明我们自己的数据类型并给予它们命名。
  • 我们可以按如下所示修改代码,以实现我们自己的名为Student:
class Student: ... def main(): student = get_student() print(f"{} from {}") def get_student(): student = Student() = input("Name: ") = input("House: ") return student if __name__ == "__main__": main()

按照惯例通知Student 是大写的。此外,请注意... 只是表示我们稍后将返回以完成该部分代码。get_student,我们可以创建一个student 类的Student 使用语法student = Student()。此外,请注意,我们使用“点标记法”来访问此变量的属性student 类的Student。

  • 任何时候创建一个类并利用这个蓝图创建一些东西,都创建了一个所谓的“对象”或“实例,”在我们的代码中,student 是物件。
  • 此外,我们还可以为对象内部所需的属性奠定一些基础,该对象的类Student。我们可以修改代码如下:
class Student: def __init__(self, name, house): = name = house def main(): student = get_student() print(f"{} from {}") def get_student(): name = input("Name: ") house = input("House: ") student = Student(name, house) return student if __name__ == "__main__": main()

请注意,在Student,我们将该类的属性标准化。我们可以在class Student,称为“方法”,它确定Student类的对象的行为。在此函数中,它使用name 和house 并将这些变量赋给该对象。此外,请注意构造函数如何student = Student(name, house) 调用此函数Student 类并创建student。self 指的是刚建立的目前物件。

  • 我们可以将代码简化如下:
class Student: def __init__(self, name, house): = name = house def main(): student = get_student() print(f"{} from {}") def get_student(): name = input("Name: ") house = input("House: ") return Student(name, house) if __name__ == "__main__": main()

请注意return Student(name, house) 简化了代码的上一次迭代,其中构造函数语句在其自己的行上运行。

  • 你可以在Python的文档中了解更多信息类别。

raise

  • 面向对象的程序鼓励你将类的所有功能封装在类定义中。如果出现错误怎么办?如果有人试图随机键入一些内容怎么办?如果有人试图创建一个没有名字的学生怎么办?请按如下方式修改代码:
class Student: def __init__(self, name, house): if not name: raise ValueError("Missing name") if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid house") = name = house def main(): student = get_student() print(f"{} from {}") def get_student(): name = input("Name: ") house = input("House: ") return Student(name, house) if __name__ == "__main__": main()

请注意,现在我们是如何检查提供了名称和指定了合适的房屋的。事实证明,我们可以创建自己的异常,提醒程序员注意用户创建的称为raise的潜在错误。在上述情况下,我们提出ValueError 并显示特定的错误消息。

  • 碰巧Python允许你创建一个特定的函数,通过它你可以打印一个对象的属性。修改你的代码如下:
class Student: def __init__(self, name, house, patronus): if not name: raise ValueError("Missing name") if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid house") = name = house = patronus def __str__(self): return f"{} from {}" def main(): student = get_student() print(student) def get_student(): name = input("Name: ") house = input("House: ") patronus = input("Patronus: ") return Student(name, house, patronus) if __name__ == "__main__": main()

请注意def __str__(self) 提供了一种方法,通过它可以在调用时返回一个student。因此,作为程序员,你现在可以打印一个对象、它的属性,或者几乎任何你想要的与该对象相关的东西。

  • __str__ 是Python类自带的一个内置方法。碰巧我们也可以为一个类创建自己的方法!修改你的代码如下:
class Student: def __init__(self, name, house, patronus=None): if not name: raise ValueError("Missing name") if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid house") if patronus and patronus not in ["Stag", "Otter", "Jack Russell terrier"]: raise ValueError("Invalid patronus") = name = house = patronus def __str__(self): return f"{} from {}" def charm(self): match : case "Stag": return "" case "Otter": return "" case "Jack Russell terrier": return "" case _: return "" def main(): student = get_student() print("Expecto Patronum!") prin()) def get_student(): name = input("Name: ") house = input("House: ") patronus = input("Patronus: ") or None return Student(name, house, patronus) if __name__ == "__main__": main()

请注意我们如何定义自己的方法charm。与字典不同,类可以有称为方法的内置函数。在这种情况下,我们定义了charm 方法,其中特定的情况有特定的结果。进一步,请注意Python有能力在我们的代码中直接使用emoji。

  • 在继续之前,让我们删除我们的保护者代码。修改你的代码如下:
class Student: def __init__(self, name, house): if not name: raise ValueError("Invalid name") if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid house") = name = house def __str__(self): return f"{} from {}" def main(): student = get_student() = "Number Four, Privet Drive" print(student) def get_student(): name = input("Name: ") house = input("House: ") return Student(name, house) if __name__ == "__main__": main()

请注意,我们只有两个方法:__init__ 和__str__。

Decorators


  • 在Python中,我们使用函数“decorators”来定义属性,开始@。请修改你的程式码,如下所示:
class Student: def __init__(self, name, house): if not name: raise ValueError("Invalid name") = name = house def __str__(self): return f"{} from {}" # Getter for house @property def house(self): return # Setter for house @ def house(self, house): if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid house") = house def main(): student = get_student() print(student) def get_student(): name = input("Name: ") house = input("House: ") return Student(name, house) if __name__ == "__main__": main()

注意我们是如何写的@property 调用的函数house。这样做定义了house 作为我们类的属性。house 作为一个属性,我们可以有能力定义类的某些属性,_house,应该设置和检索。实际上,我们现在可以定义一个称为“setter”的函数,通过@,每当设置house属性时都会调用它——例如,使用 = "Gryffindor"。在这里,我们让setter的有效值为house。 请注意我们如何提出ValueError, 如果house 不是哈利波特的房子,否则我们就用house 更新值_house。为什么是_house 且不是house?house 是我们类的一个属性,用户通过它尝试设置我们类属性的函数。_house 是类属性本身。前导下划线,_,表示使用者不需要(实际上也不应该!)直接修改这个值。_house 应仅限 通过house setter。请注意house 属性只返回_house,我们的class属性,该属性可能已使用house setter。当使用者调用,他们得到的值为_house, 通过我们的`house` “getter”。

  • 除了房子的名字,我们还可以保护学生的名字。修改代码如下:
class Student: def __init__(self, name, house): = name = house def __str__(self): return f"{} from {}" # Getter for name @property def name(self): return # Setter for name @name.setter def name(self, name): if not name: raise ValueError("Invalid name") = name @property def house(self): return @ def house(self, house): if house not in ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"]: raise ValueError("Invalid house") = house def main(): student = get_student() print(student) def get_student(): name = input("Name: ") house = input("House: ") return Student(name, house) if __name__ == "__main__": main()

请注意,与前面的代码非常相似,我们为名称提供了getter和setter。

  • 你可以在Python的文档中了解更多信息方法。

Connecting to Previous Work in this Course


  • 虽然在本课程的前面部分中没有明确说明,但你一直在使用类和对象。
  • 如果你深入研究int,你将看到它是一个具有构造函数的类。它是创建int。你可以在Python的int查看具体内容。
  • 字符串也是一个类。如果使用了(),你使用的方法来自str 你可以在Python的str查看具体内容。
  • list 也是一个类。查看list,你可以看到其中包含的方法,如li()。你可以在Python的list查看具体内容。
  • dict 也是Python中的一个类。你可以在Python的文档中了解更多dict。
  • 要查看你沿着是如何使用类的,请转到控制台并键入code 然后编码如下:
print(type(50))

请注意,通过执行此代码,它将显示50 是int。

  • 我们也可以将此应用于str 如下所示:
print(type("hello, world"))

请注意,执行此代码将如何指示它属于str。

  • 我们也可以将此应用于list 如下所示:
print(type([]))

请注意,执行此代码将如何指示它属于list。

  • 我们还可以将此应用于list 使用Python内置的list 类如下:
print(type(list()))

请注意,执行此代码将如何指示它属于list。

  • 我们也可以将此应用于dict 如下所示:
print(type({}))

请注意,执行此代码将如何指示它属于dict。

  • 我们还可以将此应用于dict 使用Python的内置名称dict 类如下:
print(type(dict()))

请注意,执行此代码将如何指示它属于dict。

Class Methods


  • 有时候,我们希望向类本身添加功能,而不是向该类的实例添加功能。
  • @classmethod 是一个函数,我们可以使用它来为整个类添加功能。
  • 这是一个 在你的终端机视窗中,输入code 和代码如下:
import random class Hat: def __init__(self): s = ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"] def sort(self, name): print(name, "is in", random.choice(s)) hat = Hat() ("Harry")

请注意,当我们将学生的名字传递给分院帽时,分院帽会告诉我们分配给该学生的房子是什么。hat = Hat() 实例化hat得帮助部分。sort 功能始终由实例 类的Hat。通过执行("Harry"),我们将学生的名字传递给sort 特定实例的方法Hat,我们称之为hat。

  • 不过,我们可能需要运行sort 函数,而不创建分院帽的特定实例(毕竟只有一个!)。我们可以将代码修改如下:
import random class Hat: houses = ["Gryffindor", "Hufflepuff", "Ravenclaw", "Slytherin"] @classmethod def sort(cls, name): print(name, "is in", random.choice)) Hat.sort("Harry")

请注意__init__ 方法被移除,因为我们不需要在代码中的任何地方实例化帽子。self,因此不再相关并被移除。sort 作为@classmethod,替换self 与cls。最后,请注意Hat 在接近此程式码结尾的地方,会依照惯例大写,因为这是我们类别的名称。

  • 返回到 我们可以按如下所示修改代码,以解决与以下方面相关的一些错失的机会@classmethods的值:
class Student: def __init__(self, name, house): = name = house def __str__(self): return f"{} from {}" @classmethod def get(cls): name = input("Name: ") house = input("House: ") return cls(name, house) def main(): student = S() print(student) if __name__ == "__main__": main()

请注意,get_student 已移除,@classmethod 被称为get 。现在可以调用此方法,而不必首先创建学生。

Static Methods


  • 原来除了@classmethods,它们与实例方法不同,但也有其他类型的方法。
  • 使用中@staticmethod 可能是你希望探索的内容。虽然本课程没有明确介绍,但欢迎你继续学习更多有关静态方法及其与类方法的区别。

Inheritance


  • 继承可能是面向对象编程中最强大的特性。
  • 碰巧你可以创建一个类,从另一个类“继承”方法、变量和属性。
  • 在终端中,执行code wizard.py。代码为:
class Wizard: def __init__(self, name): if not name: raise ValueError("Missing name") = name ... class Student(Wizard): def __init__(self, name, house): super().__init__(name) = house ... class Professor(Wizard): def __init__(self, name, subject): super().__init__(name) = subject ... wizard = Wizard("Albus") student = Student("Harry", "Gryffindor") professor = Professor("Severus", "Defense Against the Dark Arts") ...

请注意,上面有一个名为Wizard 和名为Student。此外,请注意,有一个名为Professor。学生和教授都有名字。而且,学生和教授都是巫师。因此,Student 和Professor 继承...的特点Wizard。在“子”类Student 内,Student 可以从“父”类或“超”类继承Wizard 作为行super().__init__(name) 运行init 方法Wizard。最后,请注意,此代码的最后几行创建了一个名为Albus的向导、一个名为Harry的学生,等等。

Inheritance and Exceptions


  • 虽然我们刚刚介绍了继承,但我们在使用异常时沿着在使用它。
  • 在一个层次结构中,有子类、父类和祖类,这些类的例外情况很常见,如下所示:
BaseException +-- KeyboardInterrupt +-- Exception +-- ArithmeticError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- KeyError +-- NameError +-- SyntaxError | +-- IndentationError +-- ValueError ...
  • 你可以在Python的文档中了解更多信息例外情况。

Operator Overloading


  • 某些运算符(如+ 和- 可以“过载”以使它们可以具有除简单算术之外的更多能力。
  • 在终端窗口中,键入code vault.py。然后,编写如下代码:
class Vault: def __init__(self, galleons=0, sickles=0, knuts=0): = galleons = sickles = knuts def __str__(self): return f"{} Galleons, {} Sickles, {} Knuts" def __add__(self, other): galleons = + o sickles = + o knuts = + o return Vault(galleons, sickles, knuts) potter = Vault(100, 50, 25) print(potter) weasley = Vault(25, 50, 100) print(weasley) total = potter + weasley print(total)

请注意__str__ 方法返回带格式的字符串。此外,请注意__add__ 方法允许将两个Vault的值相加。self 是左边的+ 操作数。other 是正确的+。

  • 你可以在Python的文档中了解更多信息运算符重载。

Summing Up


现在,你已经通过面向对象的编程学习到了一个全新的功能级别。

  • 面向对象程序设计
  • 课程
  • raise
  • 类方法
  • 静态方法
  • 继承
  • 运算符重载

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“pythoncharm,pythoncharm怎么设置中文,pythoncharm下载安装教程,pythoncharm怎么运行代码”边界阅读