Python中,类的命名使用帕斯卡命名方式,即首字母大写。

Python中定义类的方式如下:

class 类名([父类名[,父类名[,...]]]):
pass

省略父类名表示该类直接继承自object,类的实例化如下:

class Person():
def __init__(self):
pass person=Person()

__init__()是类的构造函数,在实例化时调用,它的参数self表示类实例。

类中的字段

字段的访问级别:

  • Python中以双下划线开头的字段访问级别是private;
  • Python中以下划线开头的字段访问级别是protected;
  • Python中未以下划线开头的字段的访问级别是public;

上述访问级别更多的是一种编程约定,即便是以双下划线开头的字段,在类的外部也是可以访问的,但不建议这么做。示例代码如下:

class Person():
age = 24
_name = 'person'
__family_name = 'securate' def __init__(self):
print('Person init')

Person类成员:

 

在上图中,我们可以看到类中并没有出现一双下划线开头的字段__family_name,而多出一个_Person__family_name。说明类实例不可以直接访问__family_name,但可以通过实例名._Person__family_name的方式来访问。

上述三种类型的变量均可以通过类或类实例进行访问。通过self定义的变量只能通过类实例进行访问,如self.country,变量country只能通过类实例进行访问。

类中的方法

Python中方法名均为小写字母,不同单词间以下划线进行分割。

方法的覆盖

Python类中没有方法的重载,对于具有相同名称的方法,后面的定义会覆盖掉前面的定义;子类会覆盖父类中同名的方法。在Person类中定义两个同名方法say

    def say(self, message):
print(message)
def say(self, info):
print('second: '+info) person=Person()
person.say('invoke')

程序执行结果:

 

从程序运行结果可知,调用的是定义在后面的say(self, info)方法。

特殊方法

以双下划线开头和结尾的方法属于特殊方法,如:__init__(self)__call__(self)等内置方法。在我们自己定义方法时不建议采取这种方式。

方法的访问级别
  • Python中以双下划线开头的方法访问级别是private;
  • Python中以下划线开头的方法访问级别是protected;
  • Python中未以下划线开头的方法的访问级别是public;

和字段类似,上述访问级别也只是一种编程约定,即便是以双下划线开头的方法,在类的外部也是可以访问的,但不建议这么做。

实例方法

定义方法时,没有装饰器修饰且带有参数的(可以不是self),即为实例方法。
类外部通过类实例来调用,类内部通过self.方法名来调用。

def method(self):
pass
@classmethod

@classmethod是Python中的装饰器
使用@classmethod修饰的方法,必须要带参数(默认参数名是cls),该参数表示类自身。可以通过类自身或者类实例调用@classmethod修饰的方法。在@classmethod修饰的方法中无法访问实例成员,但可以通过cls或者类名访问类中的字段。

@staticmethod

使用@staticmethod修饰的方法可以没有参数,可以通过类或者类实例调用。在@staticmethod修饰的方法中,无法访问类中的实例成员,可以通过类名访问类中的字段。

继承

定义一个Chinese类,继承自Person类:

class Chinese(Person):
def __init__(self):
pass chinese=Chinese()

Chinese中的字段:

 

从Chinese类型的实例中,我们可以看到Chinese类继承了除country之外的所有字段。
子类还会继承父类中的函数,若子类没有实现自己的构造函数(__init__(self)),那么在实例化子类时会调用父类的构造函数。

子类间的类型转换

class Person():
def __init__(self):
pass
def convert(self, class_type):
if issubclass(class_type, Person):
return (class_type)(self) class Chinese(Person):
def __init__(self, convert=None):
pass
def cn_method(self):
print('chinese') class Japanese(Person):
def __init__(self, convert=None):
pass

执行类型转换:

jap = Japanese()
cn = jap.convert(Chinese)
cn.cn_method()

类型转换结果如下图:

可以看到,根据Japanese实例得到了Chinese类型实例。这里的转换只是获取了Chinese类型的实例cn,而原有的Japanese类型实例依然存在于内存中。

程序执行结果如下图:

 

推荐阅读

Python风格规范
Python进阶

参考文章:

飘逸的python - @staticmethod和@classmethod的作用与区别
Difference between @staticmethod and @classmethod in Python

 

Python中的类、对象、继承的更多相关文章

  1. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  2. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  3. python中的类与继承

    Class 类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object): pass Python 的编程习惯,类 ...

  4. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  5. 理解Python中的类对象、实例对象、属性、方法

    class Animal(object): # 类对象 age = 0 # 公有类属性 __like = None # 私有类属性 def __init__(self): # 魔法方法 self.na ...

  6. Python 中的类的继承

    class parent(object): def override1(self): print("Parent") class child(parent): def overri ...

  7. GO-结构体(类似python中的类)

    一.结构体有名属性 package main import "fmt" func main(){ type Sb struct { name string //属性名,数据类型 a ...

  8. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  9. python中的类机制

    一.python中的对象 1.python中对象种类及关系 <type 'type'>:该对象可以成为其他类的类型,python中几乎所有对象都是直接或间接由<type 'type' ...

随机推荐

  1. Centos 下 mysql root 密码重置

    重置mysql密码的方法有很多,官网也提供了很方便的快捷操作办法,可参考资料 resetting permissions .本文重置密码的具体步骤如下: 一.停止MySQL(如果处于运行状态) #se ...

  2. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  3. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  4. H5 canvas的 width、height 与style中宽高的区别

    Canvas 的width height属性 1.当使用width height属性时,显示正常不会被拉伸:如下 <canvas id="mycanvas" width=&q ...

  5. 直播推流端弱网优化策略 | 直播 SDK 性能优化实践

    弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

  6. 如何区别exists与not exists?

    1.exists:sql返回结果集为真:not exists:sql不返回结果集为真.详解过程如图: exists not exists

  7. 通过squid 禁止访问/只允许访问指定 网址

    安装 squid yum install squid -y 备份squid.conf cp  squid.conf  squid.conf-list vi  squid.conf 输入: acl de ...

  8. Configure a bridged network interface for KVM using RHEL 5.4 or later?

    environment Red Hat Enterprise Linux 5.4 or later Red Hat Enterprise Linux 6.0 or later KVM virtual ...

  9. linux上使用google身份验证器(简版)

    系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...

  10. centos 6.5 升级php

    1>追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-re ...