Python基础13 面向对象--类

Python与C++、Java等众多语言一样,被视为一种面向对象的语言。

如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。

一、类定义

一个简单的类定义如下:

class Person:

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

    def get_name(self):
        return self.name

    def greet(self):
        print("Hello, world! I‘m {}".format(self.name))

这里Person是类的名称。 Class语句创建独立的命名空间。

>>> p = Person()
>>> p.set_name(‘Mike‘)
>>> p.greet()
<__main__.Person object at 0x100614e10><class ‘__main__.Person‘>Hello, world! I‘m Mike

每个与类相关联的方法都会自动传递出参数self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

实际上,可以随便给这个参数命名,但鉴于它总是指向对象本身,因此习惯上将其命名为self。

self会自动传递,因此我们不需要传递它。

二、构造函数

类有一个名为 __init__() 的特殊方法称为构造函数,该方法在类实例化时会自动调用。

__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如:

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

实例化Person以及输出的结果示例为:

>>> p = Person(‘John‘)
__init__
John

以self为前缀的变量可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。

self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。

三、属性

1、给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。

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

2、修改属性的值

可以通过实例或者类方法对属性进行修改。

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

    def set_name(self, name):
        self.name = name
        print(‘name:‘, self.name)

p = Person(‘Mike‘)
p.name = ‘Jack‘
print(‘name:‘, p.name)

p.set_name(‘Rose‘)

输出结果为:

name: Mike
name: Jack
name: Rose

四、继承

一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。

子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

1、子类的构造函数__init__()

在子类的构造函数里,必须调用父类的构造函数,这样才能正确的初始化对象。

class Car:
    """汽车"""

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        long_name = str(self.year) + ‘ ‘ + self.make + ‘ ‘ + self.model
        return long_name.title()

class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)

2、子类的属性和方法

让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。

class ElectricCar(Car):
    """电动汽车"""

    def __init__(self, make, model, year):
        """
        电动汽车的独特之处
        初始化父类的属性,再初始化电动汽车特有的属性
        """
        super().__init__(make, model, year)
        self.battery_size = 70

    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + "-kWh battery")

my_tesla = ElectricCar(‘tesla‘, ‘model s‘, 2019)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

输出结果为:

2019 Tesla Model S
This car has a 70-kWh battery

3、重写(覆盖)父类的方法

如果子类定义的方法与父类方法同名,则调用子类实例的时候Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

假设Car类有一个名叫fill_gas_tank()的方法,它对全电动汽车来说毫无意义,因此我们可以重写它。

class ElectricCar(Car):
    --snip--

    def fill_gas_tank(self):
        """电动汽车没有油箱"""
        print("This car doesn‘t need a gas tank!")

现在如果我们对电动汽车调用fill_gas_tank(),Python将忽略Car类中的方法fill_gas_tank()。

五、静态方法和类方法

1、静态方法

静态方法的装饰器为staticmethod。

静态方法的定义中没有参数self,可直接通过类来调用,表示该方法与具体实例无关。

class MyClass:

    @staticmethod
    def smeth():
        print("This is a static method")

可像下面这样直接使用:

>>> MyClass.smeth()
This is a static method

2、类方法

类方法的装饰器为classmethod。

类方法的定义中包含类似于self的参数,通常被命名为cls。类方法也可以通过类直接调用,参数cls将自动关联到类。

class MyClass:

    @classmethod
    def cmeth(cls):
        print("This is a class method of", cls)

可像下面这样直接使用:

>>> MyClass.cmeth()
This is a class method of <class ‘__main__.MyClass‘>

原文地址:https://www.cnblogs.com/mazhiyong/p/12489264.html

时间: 2024-10-03 06:01:32

Python基础13 面向对象--类的相关文章

Python 基础之面向对象类的继承与多态

一:继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继承的那个类是父类(超类,基类)object 是所有的类的父类1.单继承 #例:class Human():    def eat(self):        print("远古人类打猎,吃猎物") def sleep(self): print("远古人类吃饱了就睡觉")

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

萌新向Python数据分析及数据挖掘 第一章 Python基础 第九节 类

第一章 Python基础 第九节 类 面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下. 其实类 和函数都是为了节省代码,有了类的的概念,就可以把相同的代码写在父类,子类继承后就可以直接使用,而且通过选择对应的父类就可以直接使用对应父类的内容. 创建和使用类 1 class Dog(): #认识狗这类东西 2 def __init__(self, name, age): #狗是肯定有名字和年龄的,是个狗就有,要用户填写 3 self.name = na

Python基础09 面向对象的进一步拓展

Python基础09 面向对象的进一步拓展 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们熟悉了对象和类的基本概念.我们将进一步拓展,以便能实际运用对象和类. 调用类的其它信息 上一讲中提到,在定义方法时,必须有self这一参数.这个参数表示某个对象.对象拥有类的所有性质,那么我们可以通过self,调用类属性. class Human(object): laugh = 'hahahaha' def show_laugh(

python3 速查参考- python基础 8 -&gt; 面向对象基础:类的创建与基础使用,类属性,property、类方法、静态方法、常用知识点概念(封装、继承等等见下一章)

基础概念 1.速查笔记: #-- 最普通的类 class C1(C2, C3): spam = 42 # 数据属性 def __init__(self, name): # 函数属性:构造函数 self.name = name def __del__(self): # 函数属性:析构函数 print("goodbey ", self.name) I1 = C1('bob') #-- Python的类没有基于参数的函数重载 class FirstClass: def test(self,

Python 基础之面向对象初识与类的封装

一: 面向对象类的初识#(1) 类的定义#三种方式:#1.class MyClass:    pass #2.推荐class MyClass():    pass #3.class MyClass(object):    pass#(2) 类的实例化class MyClass():    pass#类的实例化,实例化对象obj = MyClass() #obj 就是一个对象#(3)类的基本结构只有成员方法和成员属性对象.属性  对象.方法()#例:class MyClass():    #成员属

python基础之面向对象高级编程

面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有

Python基础08 面向对象的基本概念

Python基础 面向对象的基本概念 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程. 面向对象的最主要目的是提高程序的重复使用性.我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的.了解OOP是进一步学习Python

Python之路【第六篇】python基础 之面向对象(一)

一.三大编程范式 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比方说,你定义了一个函数),便实现了代码重用,且代码由无结构走向了结构化,创建程序的过程变得更具逻辑性 3.我们定义函数都是独立于函数外定义变量,然后作为参数传递给函数,这意味着:数据与动作是分离的 4.如果我们把数据和动作内嵌到一个结构(函数或类)里面,那么我们就有了一个'对象系统'(对象就是数据与