一、类的简述

类是面向对象编程的核心内容。通常把具有相同特征(数据元素)与行为(功能)的事物描述定义为一个类,类是一个抽象的概念,把类实例化既可以得到一个对象。

因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。

类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。

比如:把人类即为一个抽象的类,“老王”则为一个的人即对象。每个对象都有一些相同的特征,但具体的数值却不一定相同。如:每个人都有“姓名”,“国籍”,“年龄”等特征。还具有一些相同的行为,如:“吃饭”,“睡觉”,“工作”等

可以简洁的描述为:Person ({"name", "country", "age"}, {"eat", "sleep", "work"})。

在这里可以看到,类有两种属性:数据属性,行为属性。在类中行为属性一般称为“方法”。

二、数据属性

属性有两种,类属性,实例属性(对象的属性),通常把所有对象共同拥有的属性定义为类属性,如:每个人都只有两只眼等,实例属性则时根据不同的对象赋值不一样的值,如:姓名等

下面来看一个简单的代码实现:

class Person(object):

eyes = 2

#这个表示类的全局变量,这个变量是类的属性,不是实例的属性,每个

#实例的值都相同,这个值,除非去改

def __init__(self, name, age):
        self.name = name
        self.age = age

def eat(self, food):
        print("%s 吃:%s" % (self.name, food))

def eye(self):
        print("%s" % (self.eyes))

p1 = Person("张三", 18)
p2 = Person("李四", 19)

print("类的属性:", Person.__dict__)
print("对象p1的属性:", p1.__dict__)
print("对象p2的属性:", p2.__dict__)     #中间的逗号最后以一个空格输出

p1.eat("番茄炒鸡蛋")
p1.eye()

#输出结果
类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000002059BABB6A8>, 'eat': <function Person.eat at 0x000002059BABB730>, 'eye': <function Person.eye at 0x000002059BABBAE8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
对象p1的属性: {'name': '张三', 'age': 18}
对象p2的属性: {'name': '李四', 'age': 19}
张三 吃:番茄炒鸡蛋
2

先输出,类, p1, p2 的属性,得出结论

(1)实例化的对象只具备自己的数据属性(不包括类属性,即全局变量属性比如 eyes)

(2)类的属性包含:类的数据属性(全局的那些)、函数属性。

这里要注意几点:

1)方法的第一个参数不用传值,但必须在定义,因为Python解释器,做了这样的一件事,自动把调用的对象当作第一个参数传值给方法,通常定义为self(相当与c++ this)

2)对象访问属性的过程,查找属性__dict__字典,找到就访问这个属性,当对象的属性字典不存在该属性时,则会去类属性里边找,类里边也不存在时则会报错

3)类属性所有通过该类创建的对象都可以访问

1、类属性的增删该查

class Person(object):
    # 类属性添加的第一种方式
    eyes = 2

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

def say(self, w):
        print("%s说了%s" % (self.name, w))

print("1--类的属性:", Person.__dict__)

# 类属性添加的第二种方式
Person.arm = 2
print("2--添加类的属性:", Person.__dict__)

# 类属性修改
Person.arm = 1
print("3--修改类的属性:", Person.__dict__)

# 类属性删除
del Person.eyes
print("4--删除类的属性:", Person.__dict__

#输出结果
1--类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
2--添加类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'arm': 2}
3--修改类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'arm': 1}
4--删除类的属性: {'__module__': '__main__', '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'arm': 1}

看代码应该就差不多明白类属性的操作了。

注:类属性一般一经定义,不会在执行的过程中增加、删除类的属性

定义类属性一般只用第一种方法,其它的骚操作了解就好,忘了它吧

2、实例属性的增删改查

class Person(object):

def __init__(self, name):
        # 实例属性添加第一种方式
        self.name = name

def say(self, w):
        print("%s说了%s" % (self.name, w))

p1 = Person("张三")
p2 = Person("李四")
print("1--p1的属性:", p1.__dict__)
print("1--p2的属性:", p2.__dict__)

# 实例属性添加第二种方式
p1.age = 20
print("2--p1的属性:", p1.__dict__)
print("2--p2的属性:", p2.__dict__)

# 删除实例属性
del p1.name
print("3--p1的属性:", p1.__dict__)
print("3--p2的属性:", p2.__dict__)

# 修改实例属性
p1.age = 10
print("4--p1的属性:", p1.__dict__)
print("4--p2的属性:", p2.__dict__)

# 输出结果
1--p1的属性: {'name': '张三'}
1--p2的属性: {'name': '李四'}
2--p1的属性: {'name': '张三', 'age': 20}
2--p2的属性: {'name': '李四'}
3--p1的属性: {'age': 20}
3--p2的属性: {'name': '李四'}
4--p1的属性: {'age': 10}
4--p2的属性: {'name': '李四'}

实例属性跟类属性的操作差不多。从上也可以得出结论,对对象 p1 的操作并不影响 p2 的属性。

注:实例属性一般放在init方法里边初始化,不会在执行的过程中增加、删除对象的属性

三、方法

1、普通的方法

上边没有@符号修饰,供外部实例调用,普通的方法也叫实例方法,但虽然叫实例方法但却与类相关,存储在类的属性中

2、类方法

上边有@classmethod修饰,定义时第一个参数必须为"cls",并通过cls来调用类属性,无法访问实例属性

3、静态方法()

上边有@staticmethod,与类相关但不需要访问属性,无法调用其它方法与属性

class Person(object):
    eyes = 2

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

def say(self, w):  # 普通方法
        print("%s say %s" % (self.name, w))

@classmethod
    def cls_md(cls):  # 类方法
        print("这是类方法", cls.eyes)

@staticmethod
    def stat():  # 静态方法
        print("这是静态方法")

p1 = Person("zhangs")
print(Person.__dict__)
p1.say("hello")
p1.cls_md()
p1.stat()

# 输出结果
{'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001DF5205B6A8>, 'say': <function Person.say at 0x000001DF5205B730>, 'cls_md': <classmethod object at 0x000001DF5205ABE0>, 'stat': <staticmethod object at 0x000001DF5205AEB8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
zhangs say hello
这是类方法 2
这是静态方法

4、方法的增(了解即可)

class Person(object):
    eyes = 2

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

def say2(self):  # 普通方法
    print("%s 增加普通方法" % (self.name))

@classmethod
def ha2(cls):  # 类方法
    print("增加类方法", cls.eyes)

@staticmethod
def stat2():  # 静态方法
    print("增加静态方法")

print("增加前:", Person.__dict__)
Person.say2 = say2
Person.ha2 = ha2
Person.stat2 = stat2
print("增加后:", Person.__dict__)
p1 = Person("zhangs")
p1.say2()
p1.ha2()
p1.stat2()

# 输出结果
增加前: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001468207B6A8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
增加后: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001468207B6A8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'say2': <function say2 at 0x0000014681ECC1E0>, 'ha2': <classmethod object at 0x000001468207A390>, 'stat2': <staticmethod object at 0x000001468207AB70>}
zhangs 增加普通方法
增加类方法 2
增加静态方法

四、私有化

1、xx:公有变量

2、_xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from module import * 禁止导入,但from module import _xx  或 Import module还可以导入

3、__xx:双前置下划线,私有属性或方法,外部无法访问到(因为名字重整了,__xx变为_classname__xx),兼具_xx的特性

4、__xx__:前后双下划线,用户名空间的魔法对象或属性,例如:__init__,一般不��自己定义这样的变量名

5、xx_:单后置下划线,与python关键字重名+_区分,不要定义这样的变量名

python类基础知识注意点相关推荐

  1. python基础实例-Python入门基础知识实例,值得收藏!

    7月的编程语言指数榜已经发布,Python 在今年5月首次超越 Java 拿下榜首位置后,仍保持上涨趋势,正逐渐与 Java 拉开差距.(图为与去年 7 月数据对比) 上周为大家简单介绍了如何安装Py ...

  2. python基础实例-Python入门基础知识实例,

    今天小白就为大家分享一些Python的基础知识,希望大家都能快速入门Python~ 1.在Python 语言中,对象是通过引用传递的. 在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对 ...

  3. Python入门基础知识学什么?

    Python基础知识主要是针对一些零基础的同学安排的,虽说Python是相对比较简单的一门编程语言,但是没有基础的同学还是要进行系统的学习,那么Python入门基础知识学什么呢?来看看下面小编的详细介 ...

  4. Python考试基础知识

    Python考试基础知识 一.python的基本语法(包括包的导入) 二.序列类型的数据结构(重点考察列表及其基本方法) 1.前言 2.list 内容简介 2.1 list简介 2.2 list常用函 ...

  5. python必备基础代码-新手上路必学的Python函数基础知识,全在这里了(多段代码举例)...

    原标题:新手上路必学的Python函数基础知识,全在这里了(多段代码举例) 导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写 ...

  6. python入门基础知识实例-Python入门基础知识实例,

    今天小白就为大家分享一些Python的基础知识,希望大家都能快速入门Python~ 1.在Python 语言中,对象是通过引用传递的. 在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对 ...

  7. python基础知识-一篇文章搞定Python全部基础知识

    原标题:一篇文章搞定Python全部基础知识 前言: 1.Python软件安装 第一章.字符串及数字变量 1.变量 要点提炼:Python变量为强类型动态类型.换言之,变量很任性,你给他int,他就是 ...

  8. python入门基础知识实例-Python入门基础知识实例,值得收藏!

    7月的编程语言指数榜已经发布,Python 在今年5月首次超越 Java 拿下榜首位置后,仍保持上涨趋势,正逐渐与 Java 拉开差距.(图为与去年 7 月数据对比) 上周为大家简单介绍了如何安装Py ...

  9. python基础知识-Python语言基础知识总结

    本文主要向大家介绍了Python语言基础知识总结,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 可以简便的方法: (1)lambda x,y:x*y (2)list1 = lis ...

最新文章

  1. 使用坚果云同步SVN服务器数据
  2. WinForm编程数据视图之DataGridView浅析
  3. ROS launch文档介绍
  4. php 自动验证类,Thinkphp实现自动验证和自动完成
  5. 项目案例第二篇中小型公司优化性能安全篇
  6. 识别出脸部以及给脸部打马赛克
  7. 分布式监控报警平台Centreon之:Centreon简介
  8. 撸一个vue的双向绑定
  9. 调试错误解决方案之VC++
  10. 用友数据库错误“未能读取并闩锁页(1:3355)(用闩锁类型SH)”修复
  11. c语言中求tana反函数,反正切函数arctanx的导数是什么
  12. 3D MAX 中 CR 渲染较慢?Corona渲染器优化建议来了
  13. 生物特征识别:指纹识别技术应用
  14. 合肥工业大学java考试试题_合肥工业大学JAVA程序设计问答题.docx
  15. 快手短视频产品分析报告-小白文
  16. HIT 软件构造 lab2
  17. mr time android 最新版,MR.TIME MAKER for Android Wear
  18. 英特尔边缘计算技术白皮书
  19. 补码转化为原码,补码转化为负补码 的快速转换
  20. 「镁客早报」NASA成立寻找外星人研究小组;CBInsights公布全球32家AI独角兽名单...

热门文章

  1. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法
  2. 用官方2012版本131兆,一共有四个自带软件
  3. plsql cursor 函数
  4. 两个操作字符串的方法:读取指定位置的字符和找出某个字符串的位置
  5. arp攻击源代码(收集)
  6. I've got so many hongbaos(should it be translated as red bags?)
  7. linux实验报告用户管理,Linux实验报告-用命令实现用户和组的管理
  8. java ajax 登陆验证,Spring Security4实例(Java config版)——ajax登录,自定义验证
  9. iOS之深入解析谓词NSPredicate的语法与应用
  10. HarmonyOS之HiTrace日志跟踪定位分析