[精] PYTHON面向对象学习笔记 byWater

本文介绍了面向对象编程的概念,包括类、属性、方法的定义,实例化过程,特殊方法如__init__和继承,以及多态性、迭代器和访问限制。还讨论了模块调用、命名规范和一个课后练习——创建Car类并操作实例。
摘要由CSDN通过智能技术生成

面对对象编程是一种设计思想,意味着我们把对象作为程序的基本单元,而每个对象包含了自己的属性和方法。


类和实例(Class, Instance)

每个类都有自己的属性(attribute)和方法(method)

在class外部定语的可执行函数叫做function,类内部的函数叫做方法method

定义一个类和实例

# class
class Person:
    # attribute fields
    name = 'William'
    age = 45
    # method
    def greet(self):
        print("Hi, my name is " + self.name)
# Create an Object
p1 = Person()
# Call the method
p1.greet()

类的定义是一个实例的设计蓝图,p1就是我们的实例,"实例名称".方法()就是标准的方法使用。

修改一个实例

# Modify Object Properties
p1.age = 40

# Delete Object Properties
del p1.age

# Delete Objects
del p1


特殊方法

__init__是一个特殊方法,它用于初始化对象。它是一个实例被创建时最先被调用的函数,并且每次创建实例,它的__init__都会被调用,而且它的第一个参数永远是 self,指向创建的实例本身.

我们可以在inti中添加其他参数,使初始化更加灵活

class Person:
    def __init__(self, init_name):
        self.name = init_name
    def greet(self):
        print("Hi, my name is " + self.name)
p1 = Person("David")
p1.greet()


继承

在面向对象编程中,当我们已经创建了一个类,而又想再创建一个与之相似的类,比如添加几个方法,或者修改原来的方法,这时我们不必从头开始,可以从原来的类派生出一个新的类,我们把原来的类称为父类或基类,而派生出的类称为子类,子类继承了父类的所有数据和方法。

利用继承可以将class Dog简化

class Animal():
    def __init__(self, name):
        self.name = name
    def greet(self):
        print('Hello, I am %s.' % self.name)
class Dog():
    def __init__(self, name):
        self.name = name
    def greet(self):
        print('WangWang.., I am %s. ' % self.name)

简化为:(Dog 类自动获得了 Animal 类的所有数据和方法)

class Dog(Animal):
    def greet(self):
        print('WangWang.., I am %s. ' % self.name)


多态

指对不同类型的参数进行相同的操作,类可以重写父类的方法,也可以新增自己特有的方法。

class Animal():
    def __init__(self, name):
        self.name = name
    def greet(self):
        print(f'Hello, I am {self.name}.')

class Dog(Animal):
    def greet(self):
        print(f'WangWang.., I am {self.name}.')

class Cat(Animal):
    def greet(self):
        print(f'MiaoMiao.., I am {self.name}')

def hello(animal):
    animal.greet()


Iterators

望实例对象可被用于for...in循环,这时我们需要在类中定义__iter____next__方法。其中,__iter()__方法返回迭代器对象本身__next()__方法返回容器的下一个元素,在没有后续元素时会抛出StopIteration异常。(Python 的 for 循环实质上是先通过内置函数 iter() 获得一个迭代器,然后再不断调用 next() 函数实现的。)

class Fib():
    def __init__(self):
        self.a, self.b = 0, 1
    def __iter__(self):
        return self
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        return self.a

fib = Fib()
for i in fib:
    if i > 10: 
         break
    print(i)# 1, 1, 2, 3, 5, 8


访问限制 underscore

我们希望 name 属性在外部不能被访问

class Animal():
    def __init__(self, name):
        self.__name = name
    def greet(self):
        print(f'Hello, I am self.__name.')

animal = Animal('a1')
animal.__name # error

注意在 Python 中,以双下划线开头,并且以双下划线结尾(即 __xxx__)的变量是特殊变量,特殊变量是可以直接访问的。


模块调用

将定义了好多类的文件保存成py文件

再其他py文件中:

from animal import Animal#animal是文件名字, Animal是类名
animal = Animal('animal')
animal.greet()

在import后加逗号可调用多个

其他调用方法:

# importing an entire module
import animal
cat = animal.Cat('Kitty')

# import all classes from a model
from animal import *
cat = Cat('Kitty')

# Using Aliases 
from animal import Cat as C
cat = C('Kitty')


PIP包管理器

我们可以通过包管理器下载别人的包(package),包是由很多module组成的,来实现某种功能。库(library)是抽象概念,也可以是各种模块组成。而Python中最流行的包管理器就是pip。pip3的安装请大家自行搜索.

安装指令

pip3 install PIP包名称


类的编写规范 Styling Classes

类的名字最好使用骆驼命名法(CamelCase),也就是让每个单词的第一个字母大写,不使用下划线分割单词。实例和模块的名字最好都使用Snake case,也就是所有字母都小写,然后使用下划线分割。当然这不是强制的,但这是工业界比较合理的命名规范,大家可以参照一下Google的Python代码规范:styleguide | Style guides for Google-originated open-source projects

您可以使用空行来组织代码,但不要过度使用它们。在一个类中,您可以在方法之间使用一个空行,而在一个模块中,您可以使用两个空行来分隔类。

如果需要从标准库和编写的模块中导入模块,请首先将标准库模块的调用语句写在最前面。然后添加一个空行,再调用自己编写的模块。在具有多个import语句的程序中,此约定使查看程序中使用的不同模块的来源更加容易。


课后练习

创建一个Car类,其中包含brand,model,year属性。这个类初始化的时候必须要传入品牌名字(比如Subaru),初始化的时候车的型号和生产年会被默认设定为’xxx’和0,Car类还有内置方法可以修改车型号和生产年,还有可以打印出完整车信息的方法。

请根据要求定义出这个完整的类,并在另一个文件调用此类,创建一个实例,然后使用内置方法修改车的型号和生产年,最后使用类的方法打印出车的完整信息。

# car.py
class Car:
    brand, model, year

    def __init__(self, brand): 
        self.brand = brand
        model = 'xxx'
        year = 0
   
    def set_model(self, model):
        self.model = model

    def set_year(self, year): 
        self.year = year

    def get_info(self): 
        print(f"Brand: {self.brand}, Model: {self.model}, Year: {self.year}")
# main.py
from car import Car
new_car = Car("Subaru")
new_car.set_model("WRX")
new_car.set_year(2014)
new_car.get_info()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值