创建一个简单的类

根据Dog类创建的每个实列都将存储名字和年龄。我们赋予了每条小狗蹲下(sit())和打滚(roll_over())的能力:

 class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + "now is sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + "rolled over!")
my_dog = Dog('tom','')
print("my dog name is " + my_dog.name.title() )
根据约定,在Python中,首字母大写的名称指的是类:类中的函数称为方法
方法__init__(),开头和末尾都有2个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称的冲突。我们将方法__init__()定义成了包含三个形参: self、 name和age。在这个方法的定义中,参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。 两个变量self_name和self_age都有前缀self,以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实列来访问这些变量。像这样可通过实例访问的变量称为属性。
在python2.X中,如果创建类需要在括号后面加上(object)。
 

访问属性

继续上面的例子,方法__init__()创建一个表示特定小狗的示例,并使用我们提供的值来设置属性name和age,方法__init__()并未显式地包含return语句,但python自动返回一个表示这条小狗的示例。我们将这个示例存储在变量my_dog中。
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " now is sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
my_dog = Dog('tom',3)
print(my_dog.name)
print(my_dog.age)
#运行结果
tom
3

调用方法

class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " now is sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
my_dog = Dog('tom',3)
my_dog.sit()
my_dog.roll_over()
#运行结果
Tom now is sitting.
Tom rolled over!

根据Dog类创建实例后,就可以使用句点表示来调用Dog来定义的任何方法

创建多个实例

class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " now is sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
my_dog = Dog('tom',3)
your_dog = Dog('Mei',2)
print("My dog name is " + my_dog.name.title())
print("Your dog name is " + your_dog.name.title())
#运行结果
My dog name is Tom
Your dog name is Mei

可按需求根据类创建任意数量的实例。

使用类和实例

给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串,在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值时可以的没如果你对某个属性这样做了,就无需包含为他提供初始化的形参。
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""汽车的初始化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 100
def get_descri_name(self):
"""描述汽车"""
long_name = str(self.year) + ' ' + self.model + ' ' + self.make
return long_name
my_car = Car('audi', 'a4', '')
print(my_car.model)
print(my_car.get_descri_name())
#运行结果
a4
2017 a4 audi

直接修改属性的值

class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""汽车的初始化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 100
def get_descri_name(self):
"""描述汽车"""
long_name = str(self.year) + ' ' + self.model + ' ' + self.make
return long_name
my_car = Car('audi', 'a4', '')
print(my_car.get_descri_name())
my_car.year = 2016
print(my_car.get_descri_name())
#运行结果
2017 a4 audi
2016 a4 audi

通过方法修改

class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""汽车的初始化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 100
def get_descri_name(self):
"""描述汽车"""
long_name = str(self.year) + ' ' + self.model + ' ' + self.make
return long_name
def update(self, mile):
"""更新里程值"""
if mile > self.odometer_reading:
self.odometer_reading = mile
else:
print("You can't roll back an odometer")
def increment_odometer(self,mile):
"""增加里程"""
self.odometer_reading += mile
def read_odometer(self):
"""打印汽车的里程"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
my_car = Car('audi', 'a4', '')
my_car.read_odometer()
my_car.odometer_reading = 10 #直接修改里程值
my_car.update(200) #通过方法修改里程
my_car.read_odometer()
my_car.increment_odometer(10)
my_car.read_odometer()
#运行结果
This car has 100 miles on it.
This car has 200 miles on it.
This car has 210 miles on it.

继承

如果我们想再一个class继承另一个类的属性,可以在类后面括号中加入类的名称,举例如下:

class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""汽车的初始化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 100
def get_descri_name(self):
"""描述汽车"""
long_name = str(self.year) + ' ' + self.model + ' ' + self.make
return long_name
def update(self, mile):
"""更新里程值"""
if mile > self.odometer_reading:
self.odometer_reading = mile
else:
print("You can't roll back an odometer")
def increment_odometer(self,mile):
"""增加里程"""
self.odometer_reading += mile
def read_odometer(self):
"""打印汽车的里程"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
class ElectricCar(Car):
"""电动汽车的独特特性"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', '')
print(my_tesla.get_descri_name())
#运行结果
2016 model s tesla

为了继承父类的属性,还需要加入一个特殊的函数super(),帮助python将夫类和子类关联起来。

在python2.X中,类supper的格式如下:supper(Eletric,self).__init__(make, model, year)
给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所属的新属性和新方法。
将实例用作属性

class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""汽车的初始化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 100
def get_descri_name(self):
"""描述汽车"""
long_name = str(self.year) + ' ' + self.model + ' ' + self.make
return long_name
def update(self, mile):
"""更新里程值"""
if mile > self.odometer_reading:
self.odometer_reading = mile
else:
print("You can't roll back an odometer")
def increment_odometer(self,mile):
"""增加里程"""
self.odometer_reading += mile
def read_odometer(self):
"""打印汽车的里程"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
class Battery():
"""一次模拟电动汽车"""
def __init__(self,battery_size=70):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
class ElectricCar(Car):
"""电动汽车的独特特性"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', '')
print(my_tesla.get_descri_name())
my_tesla.battery.describe_battery()
#运行结果
2016 model s tesla
This car has a 70-kwh battery.

导入类

导入单个或者多个类
一个文件car.py
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""汽车的初始化"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 100
def get_descri_name(self):
"""描述汽车"""
long_name = str(self.year) + ' ' + self.model + ' ' + self.make
return long_name
def update(self, mile):
"""更新里程值"""
if mile > self.odometer_reading:
self.odometer_reading = mile
else:
print("You can't roll back an odometer")
def increment_odometer(self,mile):
"""增加里程"""
self.odometer_reading += mile
def read_odometer(self):
"""打印汽车的里程"""
print("This car has " + str(self.odometer_reading) + " miles on it.") class Battery():
"""一次模拟电动汽车"""
def __init__(self,battery_size=70):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
class ElectricCar(Car):
"""电动汽车的独特特性"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
self.battery = Battery()

创建另一个文件my_car.py,导入一个类

from  car import Car
my_car = Car('audi', 'a4', '')

一个模块中可以存储多个类,所以可以一次导入多个类

from car import Car,Battery,ElectricCar
my_tesla = ElectricCar('tesla', 'model s', '')
print(my_tesla.get_descri_name())
my_tesla.battery.describe_battery()

导入整个模块

import car     #导入整个模块的时候,需要使用句点表示法访问需要的类
my_tesla = car.ElectricCar('tesla', 'model s', '')
print(my_tesla.battery)

导入所有类

from car import *    #导入所有的类
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

《Python编程从入门到实践》_第九章_类的更多相关文章

  1. 《Python编程从入门到实践》第二章_变量和简单数据类型

    什么是变量呢? 举例: >>> message = "Hello,Python!" >>> print (message) Hello,Pyth ...

  2. #Python编程从入门到实践#第四章笔记

    #Python编程从入门到实践#第四章笔记   操作列表 ​​​1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...

  3. #Python编程从入门到实践#第三章笔记

      列表简介 ​​​1.什么是列表 列表:由一系列按也顶顺序排列的元素组成.元素之间可以没有任何关系. 列表:用方括号[]表示,并用逗号分隔其中元素.名称一般为复数 2.访问元素 (1)列表是有序集合 ...

  4. 《Python编程从入门到实践》_第十章_文件和异常

    读取整个文件 文件pi_digits.txt #文件pi_digits.txt 3.1415926535 8979323846 2643383279 下面的程序打开并读取整个文件,再将其内容显示到屏幕 ...

  5. 《python编程从入门到实践》读书实践笔记(一)

    本文是<python编程从入门到实践>读书实践笔记1~10章的内容,主要包含安装.基础类型.函数.类.文件读写及异常的内容. 1 起步 1.1 搭建环境 1.1.1 Python 版本选择 ...

  6. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  7. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  8. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  9. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  10. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

随机推荐

  1. 以太坊系列之六: p2p模块--以太坊源码学习

    p2p模块 p2p模块对外暴露了Server关键结构,帮助上层管理复杂的p2p网路,使其集中于Protocol的实现,只关注于数据的传输. Server使用discover模块,在指定的UDP端口管理 ...

  2. 内存布局------c++程序设计基础、编程抽象与算法策略

    图中给出了在一个典型c++程序中如何组织内存的框架.程序中的指令(在底层都是按位存储的).全局变量.静态对象和只读常量往往被存储在静态去(static area)(第二个图中的数据段.代码段.值得注意 ...

  3. IIS只允许某些IP访问

    1. 2. 3.访问时提示 4.设置允许访问的IP 5.指定的IP访问时没问题了,而其他的IP不允许访问

  4. win10 + Lubuntu 双系统安装

    win10 + Lubuntu 双系统安装 最近重装了系统,索性直接安装win10 + Lubuntu 双系统,便于在物理机下进行 Linux开发. 这里我选择的 Linux 发行版是 Lubuntu ...

  5. 题解 P2863 【[USACO06JAN]牛的舞会The Cow Prom】

    题目链接 赤裸裸的板子,就加一个特判就行.直接上代码 #include<stdio.h> #include<algorithm> #include<iostream> ...

  6. The server of Apache (四)——配置防盗链和隐藏版本信息

    一.防盗链 防盗链就是防止别人的网站代码里面盗用我们服务器的图片.文件.视频等相关资源,比如我们的网页的图片有链接,别人把链接复制粘贴到他们的服务器页面里,图片不在他们自己的网站里,每次打开他们的网站 ...

  7. c++11中关于`std::thread`线程传参的思考

    关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...

  8. 5、用Numpy实现结构体

    1.结构数组: 在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地定义结构数组.和C语言一样,在NumPy中也很容易 ...

  9. 【Linux】DNS服务-BIND基础配置

    1.BIND简介 现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早有伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Intern ...

  10. 洛谷P2679 子串

    放题解 题目传送门 放代码