1、类定义:Python3中,如果新建的类没有继承任何其他类,默认继承基础类object。Python2中如果没有显式继承object类就是经典类,而显式继承了object类就是新式类,Python2推荐使用新式类。

2、类变量:类变量就是直接在类中,但是在方法外定义的变量。类变量是所有该类的实例所共有的,且类的每个实例都可以修改类变量。

3、成员变量:成员变量就是在定义时加了self前缀的变量,一般在__init__方法就定义了,成员变量会跟着实例“一起走”。

4、类的继承:直接在类后括号里加上要继承的类就行,继承多个类时,类之间用逗号分隔即可。

5、成员方法:新建方法时默认为新建一个成员方法,方法的第一个参数必须为self,self代表着实例本身,相当于每次都会将实例本身当参数传进去。

6、类方法:方法“头上”加上装饰器@classmethod,方法的第一个参数必须为cls,代表着类本身。

7、静态方法:方法“头上”加上装饰器@staticmethod,即普通函数,参数没有强制要求。

8、特殊方法:

  • __init__:类的初始化方法,在一个类实例化之后会自动调用这个方法,实例化时传进去的参数也是按这个初始化方法来定的。
  • __new__:类的构造方法,该方法返回本类的一个实例。执行完此方法后,会自动调用类的__init__方法来初始化该实例,需要注意的是,如果自己重写了这个方法,一定要返回本类的实例,否则执行__new__后不会调用__init__。
  • __call__:当一个实例对象以函数的形式调用时,就会执行此方法,前提是类中已经定义了此方法,没有定义的话,就会报错。例如:a = A(),a()就会调用类A中__call__方法,当然,如果没有定义__call__,就会报错。
  • __str__:面向用户的方法,使用print打印类实例时,如果类重写了方法__str__,会优先打印输出__str__的返回值,如果没有重写这个方法就会打印__repr__方法的返回值。
  • __repr__:面向Python本身的方法,默认返回值为类实例的内存地址,直接输出者类实例时,如在Python的IDLE中直接“>>> a”(a为类A的实例),就会打印__repr__的返回值。

类的简单示例:

# 推荐使用新式类,即继承object
class FirstClass(object):
var1 = 30 # 定义类变量
var2 = 50 # 初始化方法
def __init__(self, para1, para2):
# 定义成员变量
self.para1 = para1
self.para2 = para2 # 成员方法,默认带参数self
def func1(self):
print('hello, guys!') # 也可以不在初始化方法定义成员变量,不推荐!!!
def func2(self, para3):
self.para3 = para3 # 静态方法,不用带self参数
@staticmethod
def func3():
return 'static method' # 类方法,需要带cls参数,表示类本身
@classmethod
def func4(cls):
cls.var1 = 'var1'

examp1 = FirstClass('hi', 'hello')
examp2 = FirstClass('python', 'java')
examp1.func1()
examp2.func1()
examp1.func2('hei!')
print(examp1.var1)
print(examp2.var2)
print(examp2.para1)
print(examp1.para2)
print(examp1.para3) 输出:
hello, guys!
hello, guys!
30
50
python
hello
hei!

 11、@property:该装饰器用于定义类属性的get方法和set方法,在一个方法上使用@property,该方法名就会成为外部访问对应属性的属性名,并且会自动生成一个xxx.setter的装饰器,用于定义对应的set方法,注意get方法和set方法的方法名都是一样的。@property一般用于保护属性或者私有属性,因为公共属性在哪都可以访问和修改,没有必要再去定义@property方法。

@property的简单示例:

class MyClass:
def __init__(self):
# 前面加两个下划线表示私有属性,外部不可访问
# 这里为了方便测试,看到运行后的效果,定义为私有属性
# 需要用到@property的属性一般定义为保护或者私有,
# 不然公共的属性,谁都可以访问和修改,就没必要使用@property
self.__var = 0 # 加了@property后,函数名my_var自动成为外部访问的属性名,即get方法,而外部就不能访问直接访问__var属性了
# 并且自动创建另一个装饰器@my_var.setter,用于设置该属性值,即set方法
@property
def my_var(self):
return self.__var # set方法这里要注意函数名需要与get方法一致
@my_var.setter
def my_var(self, value):
self.__var = value # 实例化,定义一个私有属性
myclass = MyClass()
# 访问私有属性,自动调用get方法,即@property修饰的函数my_var
print(myclass.my_var)
# 设置私有属性,自动调用set方法,即my_var.setter修饰的函数my_var
myclass.my_var = 33
print(myclass.my_var) # 以下可自行测试
# 私有属性不可访问,会报错
# print(myclass.__var)
# 私有属性设置无效
# myclass.__var = 44
# print(myclass.my_var)

输出:

0
33

注:

  • self和cls都是约定的,不是语法规定必须写成这样,但是强烈建议不要自己定义。

Python学习笔记:面向对象(类)的更多相关文章

  1. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  2. python学习笔记----面向对象

    面向对象 类:成员变量(属性) 方法(操作成员变量) 出一个场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...

  3. Python学习笔记 - day7 - 类

    类 面向对象最重要的概念就是类(Class)和实例(Instance),比如球类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同.在Python中,定义类 ...

  4. python学习笔记--面向对象的编程和类

    一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模 ...

  5. Python 学习笔记13 类 - 创建和简单使用

    介绍: 面向对象编程是一种非常有效的软件编写方法之一,在面向对象编程中,我们会编写表示现实世界中的事物或者情景的类,并基于类来创建对象. 在编写类的的时候,这些类对象一般都有通用的行为或者属性.基于类 ...

  6. python学习笔记1-元类__metaclass__

    type 其实就是元类,type 是python 背后创建所有对象的元类   python 中的类的创建规则: 假设创建Foo 这个类 class Foo(Bar): def __init__(): ...

  7. Python学习笔记12—类

    典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...

  8. Python 学习笔记 - 10.类(Class) 1

    定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析 ...

  9. Python学习笔记——面向对象基础

    1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有 ...

  10. Python学习笔记008_类_对象_继承_组合_类相关的BIF

    # 对象 = 属性 + 方法>>> # Python中的类名约定以大写字母开始>>> # tt = Turtle() 这就是创建类实例的方法,其它语言用new ,它 ...

随机推荐

  1. PHPstudy安装redis扩展

    PHPstudy安装redis扩展 第一步:查看PHP版本(phpinfo) 第二步:下载所需的扩展(http://pecl.php.net/package/redis   .   http://wi ...

  2. 51NOD 区间的价值 V2

    http://www.51nod.com/contest/problem.html#!problemId=1674 因为题目要求的只是& 和 | 这两个运算.而这两个运算产生的值是有限的. & ...

  3. (转)通过MySQL复制线程SQL_Thread加快增量恢复binlog

    数据回档常常是使用全量备份+binlog增量实现的.而数据量很大的情况下,增量恢复binlog一直是一个苦恼的问题,因为恢复binlog速度十分慢,并且容易出错. 恢复binlog文件一般有两种方法: ...

  4. 2、linux基础知识与技能

    2.1.linux内核.发行版linux本身指的是一个操作系统内核,只有内核是无法直接使用的.我们需要的,可以使用的操作系统是一个包含了内核和一批有用的应用程序的一个集合体,这个就叫linux发行版. ...

  5. git忽略已经被提交的文件

    git忽略已经被提交的文件 git rm --cached logs/xx.log 然后更新 .gitignore 忽略掉目标文件, 最后 git commit -m "We really ...

  6. Error: EPERM: operation not permitted,

    转载自:https://blog.csdn.net/dong923700243/article/details/78989332 npm ERR! path E:\React\ReactNativeP ...

  7. 1143 纪念品分组 2007年NOIP全国联赛普及组

    1143 纪念品分组 2007年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 Descri ...

  8. virtualapk爬坑心得

    1.宿主和插件的工程build.gradle必须是 com.android.tools.build:gradle:2.1.3 gradle-wrapper 必须是 gradle-2.14.1-all ...

  9. Jenkins任务失败,发送邮件通知

    1.进入系统管理->系统设置,然后进行下面设置: 2.配置管理员邮件账号,需要和后面的邮件发送者一致.否则可能会发送不成功 3.配置基础的邮件发送的配置 4.配置邮件扩展配置--用来自定义邮件格 ...

  10. python中__file__

    用__file__ 来获得脚本所在的路径,比如文件在/root下 cat tee #!/usr/bin/env pythonprint __file__              #得到相对路径tee ...