24 【python入门指南】class
一、类
1.1,构造函数,析构函数
- #!/bin/python
- class dog():
- def __init__(self, age, name):
- self.age = age
- self.name = name
- def print_self(self):
- print('Dog name is %s' %(self.name))
- print('Dog age is %d' %(self.age))
- a = dog(10, 'alaski')
- a.print_self()
输出结果:
- Dog name is alaski
- Dog age is 10
析构函数
- #!/bin/python
- class dog():
- def __init__(self, age, name):
- self.age = age
- self.name = name
- def print_self(self):
- print('Dog name is %s' %(self.name))
- print('Dog age is %d' %(self.age))
- def __del__(self):
- print("delete dog object %s" %(self.name))
- a = dog(10, 'alaski')
- a.print_self()
输出结果:
- Dog name is alaski
- Dog age is 10
- delete dog object alaski
以上介绍了构造函数:__init__,析构函数:__del__。
1.2,变量
公有变量,私有变量
首先介绍一个背景,python对于类有个默认预定:
vvv:正常以a-z开头的变量,或者方法,python认定其为公有变量或者函数;
_vvv:(单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入)这个是从参考资料中查到的,我没有验证过【参考资料1】;
__vvv:如果以两个下划线开头,后面再接a-z的话,python认定其为私有变量或者函数;
__vv__:如果以两个下划线开头,并且两个下划线截止的格式,python认定其为保留格式,python用于内置函数或者扩展用法,应用程序杜绝这种写法,仅适用于python官方开发人员使用;
公有,私有变量
- #!/bin/python
- class dog():
- def __init__(self, age, name):
- self.age = age
- self.name = name
- self.__type = 'dog'
- def print_self(self):
- print('Dog name is %s' %(self.name))
- print('Dog age is %d' %(self.age))
- print('Animal type is %s' %(self.__type))
- a = dog(10, 'alaski')
- a.print_self()
- print(a.name)
- #AttributeError: 'dog' object has no attribute '__type'
- print(a.__type)
输出结果:
- Dog name is alaski
- Dog age is 10
- Animal type is dog
- alask
1.3,函数
公有函数,私有函数
- #!/bin/python
- class dog():
- def __init__(self, age, name):
- self.age = age
- self.name = name
- self.__type = 'dog'
- def print_self(self):
- print('Dog name is %s' %(self.name))
- print('Dog age is %d' %(self.age))
- print('Animal type is %s' %(self.__type))
- def smile(self):
- print('Dog(%s) is smiling' %(self.name))
- self.__set_smiling()
- def __set_smiling(self):
- self.__attitude = 'smile'
- a = dog(10, 'alaski')
- a.smile()
- #AttributeError: 'dog' object has no attribute '__set_smiling'
- a.__set_smiling()
输出结果:
- Dog(alaski) is smiling
可以看到,dog类中的私有函数为__set_smiling,它可以被类中的函数调用,但是无法在类外使用(使用会报错)。
1.4,static变量和函数
目前我查到的资料中显示,python并不天然支持static变量和static函数。
二,继承
2.1,继承
- #!/bin/python
- class person:
- def __init__(self):
- print("person is intialized")
- def say(self):
- print("person is saying")
- class driver(person):
- def __init__(self):
- super().__init__()
- print("i am a driver")
- def say(self):
- print("driver is saying")
- a = driver()
- a.say()
输出结果:
- person is intialized
- i am a driver
- driver is saying
driver继承了person类,并在初始化的时候调用了父类的初始化构造函数。
2.2,父类的私有类是否能被继承?
如果父类的函数是私有函数,也就是以__开头的,是不允许子类访问的。
代码:
- #!/bin/python
- class person:
- def __init__(self):
- print("person is intialized")
- def say(self):
- print("person is saying")
- def __say_to_self(self):
- print('i am saying sth to myself')
- class driver(person):
- def __init__(self):
- super().__init__()
- super().__say_to_self()
- print("i am a driver")
- def say(self):
- print("driver is saying")
- a = driver()
- a.say()
报错:
- person is intialized
- Traceback (most recent call last):
- File "class2.py", line 20, in <module>
- a = driver()
- File "class2.py", line 14, in __init__
- super().__say_to_self()
- AttributeError: 'super' object has no attribute '_driver__say_to_self'
2.3,设定某些函数可以被自身及其子类所访问
- #!/bin/python
- class person:
- def __init__(self):
- print("person is intialized")
- def say(self):
- print("person is saying")
- def __say_to_self(self):
- print('i am saying sth to myself')
- def _say_to_other(self):
- print('i am saying sth to other, and the saying is listened by all of them')
- class driver(person):
- def __init__(self):
- super().__init__()
- super()._say_to_other()
- print("i am a driver")
- def say(self):
- print("driver is saying")
- a = driver()
- a._say_to_other()
输出:
- person is intialized
- i am saying sth to other, and the saying is listened by all of them
- i am a driver
- i am saying sth to other, and the saying is listened by all of them
设定的_say_to_other是可以被子类所访问的,但是它和c++中的protected不一样。以单个下划线开头的函数,和公开方法是一样的,既可以被自身和子类访问,又能在类外所访问。
三、导入类
3.1,导入单个类
- 文件: car.py
- #!/bin/python
- class Car:
- year = 0
- brand = ''
- series = ''
- def __init__(self, brand, series, year):
- self.brand = brand
- self.series = series
- self.year = year
- def get_car_desc(self):
- desc = ''
- desc += ("car info: [year:%d] [brand:%s] [series:%s]" % (self.year, self.brand, self.series))
- return desc
- 文件: my_car.py
- #!/bin/python
- from car import Car
- c = Car('tesla', 'Model X', 2016)
- d = c.get_car_desc()
- print(d)
可以在my_car.py中引入类Car,引用时候使用from car import Car
from [A] import [B]
A要和文件名前缀保持一致,B要和类名保持一致,并且要区分大小写。
3.2,在一个模块中存储多个类
- 文件:car.py
- #!/bin/python
- class Car:
- year = 0
- brand = ''
- series = ''
- def __init__(self, brand, series, year):
- self.brand = brand
- self.series = series
- self.year = year
- def get_car_desc(self):
- desc = ''
- desc += ("car info: [year:%d] [brand:%s] [series:%s]" % (self.year, self.brand, self.series))
- return desc
- class ElectricCar(Car):
- def __init__(self, brand, series, year):
- super().__init__(brand, series, year)
- def get_range():
- return "100 miles"
- 文件:my_car.py
- #!/bin/python
- from car import Car
- from car import ElectricCar
- c = Car('bmw', 'X3', 2016)
- d = c.get_car_desc()
- print(d)
- tesla = ElectricCar('tesla', 'Model S', 2017)
- d = tesla.get_car_desc()
- print(d)
3.3,从一个模块中导入多个类
和3.2公用一个例子
from car import Car, ElectricCar可以存储和导入多个类
3.4,导入整个模块
- #!/bin/python
- import car
- c = car.Car('Nissan', 'Sylphy', 2012)
- print(c.get_car_desc())
car.py仍然使用之前的文件,但是my_car.py需要修改下。
导入整个模块使用import car,但是初始化实例时候需要使用全称,不能简化:a = car.Car()这种方式。
参考资料:
1,https://www.cnblogs.com/semon-code/p/8242062.html
24 【python入门指南】class的更多相关文章
- Python入门指南(超详细)
Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑科技.本文主要针对的读者是: 毫无 ...
- Python 入门指南
Release: 3.4 Date: March 29, 2014 Python 是一门简单易学且功能强大的编程语言. 它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程. Pyt ...
- 25 【python入门指南】如何编写测试代码
python如何编写测试代码 python内置了unittest,使得写应用层的单元测试变得超乎寻常的简单. 1,执行单个测试函数 #!/bin/python import unittest clas ...
- python入门教程链接
python安装 选择 2.7及以上版本 linux: 一般都自带 windows: https://www.python.org/downloads/windows/ mac os: https:/ ...
- Python入门一:简单得不能再简单了##
从python的语法上看,简单得不能再简单了. 想学它,请移步廖雪峰python2.7教程以及python3.这实在是最好的入门教程.参考资料太多: 外国的教程 Python 入门指南 Python ...
- Python不完全入门指南
适用范围: 有一定编程基础,想快速入门python的人群 说明: 使用jupyter notebook编写,可以使用nbviewer网站进行查看. Python不完全入门指南 项目放在github上, ...
- Python 30分钟入门指南
Python 30分钟入门指南 为什么 OIer 要学 Python? Python 语言特性简洁明了,使用 Python 写测试数据生成器和对拍器,比编写 C++ 事半功倍. Python 学习成本 ...
- Python 30分钟快速入门指南
学习地址 中文版:Python 30分钟入门指南 英文版:Learn X in Y minutes 学习时间 2019/03/10 19:00 - 19:32,多用了2分钟.
- Python 极速入门指南
前言 转载于本人博客. 面向有编程经验者的极速入门指南. 大部分内容简化于 W3School,翻译不一定准确,因此标注了英文. 包括代码一共两万字符左右,预计阅读时间一小时. 目前我的博客长文显示效果 ...
随机推荐
- mobile-net v2 学习记录。我是菜鸡!
声明:只是自己写博客总结下,不保证正确性,我的理解很可能是错的.. 首先,mobile net V1的主要特点是: 1.深度可分离卷积.用depth-wise convolution来分层过滤特征,再 ...
- C++复习:继承与派生
1继承概念 面向对象程序设计有4个主要特点:抽象.封装.继承和多态性.说了类和对象,了解了面向对象程序设计的两个重要特征一数据抽象与封装,已经能够设计出基于对象的程序,这是面向对象程序设计的基础. 要 ...
- Unable to locate Spring NamespaceHandler for XML schema namespace
1. 问题 本文将讨论Spring中最常见的配置问题 —— Spring的一个命名空间的名称空间处理程序没有找到. 大多数情况下,是由于一个特定的Spring的jar没有配置在classpath下,让 ...
- [CI]CodeIgniter视图 & 模型 & 控制器
---------------------------------------------------------------------------------------------------- ...
- Matlab实现BP网络识别字母
训练样本空间 每个样本使用5×5的二值矩阵表征一个字母.一共10个字母类型,分别是N,I,L,H,T,C,E,F,Z,V.每个字母9个样本.共90个. N1=[1,0,0,0,1; 1,0,0,0 ...
- 使用__slots__限制实例的属性
1.给实例化的对象添加新的属性 看下面一段代码,然后给实例化的对象s添加或者修改属性 class Student(object): name='china' s = Student() s1=Stud ...
- opencv批量读取图片
#include<opencv2/opencv.hpp>using namespace cv;using namespace std;int main(){ int num=4;// ...
- php urldecode 与rawdecode
php urldecode 解码给出的已编码字符串中的任何 %##. 加号('+')被解码成一个空格字符 php rawurldecode 返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都 ...
- Manifest File
[Manifest File] on every build, webpack generates some webpack runtime code, which helps webpack do ...
- node 加载逻辑
[node 加载逻辑] require(X) from module at path Y . If X is a core module, a. return the core module b. S ...