Python基础:Python类(真累~)

类的声明:

一、类的属性

(私有属性和公有属性)

(类属性)

二、类的方法

(构造方法、析构方法、自定义方法、特殊成员方法)

(静态方法、类方法、类属性)

三、类的继承

(方法和属性的继承,方法的重构)

(抽象类,多重继承)

四、类的多态

(实现接口的重用)

五、类的特殊装饰

(@staticmethod、@classmethod、@property)

六、类的来源和原类(metaclass)

七、反射

  • 类的声明

    使用class声明类,建议类名单词首字母大写。

    “新式类”和“经典类”的区分在Python 3之后就已经不存在,在Python 3.x之后的版本,因为所有的类都派生自内置类型object(即使没有显示的继承object类型),即所有的类都是“新式类”。

    新式类:

class Management(object):

    def add():
        pass

经典类:

class Management:
    pass
  • 类的属性

    类的属性就是类定义的变量值。

公有属性:在类里直接定义的属性,它在类名下面直接定义。

调用:1、类中调用:类名.属性名 ,更改原公有属性值

2、实例调用:实例.属性名

class Management(object):
    num = 10

    def add(self):
        Management.num +=10            # 类中调用公有属性并更改值,num=11
        pass

s1 = Management()
s2 = Management()

# 第一种情况:s1实例中调用公有属性,s2实例没有调用公有属性
s1.num +=1
Management.num += 2
"""
<结果>
s1不变,s2和Management都改变了
s1_num:11   s2_num:12   Manage_num:12
"""

# 第二种情况:先调用s1实例公有属性,再通过S1调用add更改,然后再使用类更改
s1.num +=1
s1.add()
Management.num += 2
"""
<结果>
先调用的s1实例num依然不变,s2和Management都被修改了
s1_num:11   s2_num:22   Manage_num:22

"""

问题:为什么修改num的值以后,实例s1和实例s2会有不同的结果呢 ?

因为公有属性查找的顺序是:先找实例的公有属性,没找到再找类里的公有属性

可以这样理解:Management相当于一个微信群,num是群里发的一张照片,S1和S2是群里面的两个人。

情况1:S1把照片存到本地,P了个双眼皮,S2说太难看了,我也不会P图,不保存。这个时候发照片的Management说我也觉得难看,把图撤回,重新发了一个P的图。S2就只能保存最新的图片。

情况2:S1找到Management说你的图太丑了,重新改一下吧,Management说好!撤回图片修改了~

私有属性:加两个下划线,__membername,编译的时候自动加上类名,变成_classname__membername,这种技术叫变量名压缩(mangling),以达到外部不能调用的目的。实际使用_classname__membername是可以调用的,但是不符合规定。标准方法是通过定义函数来获取。

class Classname(object):
 '''this is a demo!'''
 def __init__(self):
  self.__membername = 88

 def read_membername(self):            # 标准的外部访问方法,使用函数来读取私有属性。
  return self.__membername

s= Classname()
print(s._Classname__membername)
print(s.read_membername())
'''
<结果>
88
88
------像下面的调用,会出现AttributeError错误------
print(s.__membername)
'''

类属性:  类自带的属性,需要注意的是实例化的类属性,和原类的类属性不同。用上面的例子作演示。

属性 作用 示例 结果
__doc__ 类的文档字符串 print(s.__doc__)
print(Classname.__doc__)

this is a demo!

this is a demo!

__dict__ 类的属性组成的字典 print(s.__dict__)
print(Classname.__dict__)

{'_Classname__membername': 88}

{'__init__':, '__module__': '__main__', '__doc__': '\nthis is a demo!\n', 'read_membername':}

__name__ 类的名字(字符串) ##不能用于实例print(s.__name__ )
print(Classname.__name__ )

Classname

__bases__ 类的所有父类组成的元组 #不能用于实例print(s.__bases__)
print(Classname.__bases__)

(,)为什么没有值?可能是编译器问题

__module__ 类所属的模块 print(s.__module__)
print(Classname.__module__)
__main__
__main__
__class__ 类对象的类型 print(s.__class__)
print(Classname.__class__)
待测
__slots__
限定类属性,在类属性位置定义

未在slots定义的属性都是非法属性

__slots__.('name','age','sexy') 使用'name','age','sexy'的以外属性会报错
  • 类的方法

    类的方法就是类里面定义的函数。类的构造方法、析构方法、自定义类方法、静态方法、类方法、属性方法、特殊成员方法。

    构造方法:__init__

    实例化类的时候就会运行的函数。希望初始化的参数放置在init下面。(个人觉得,这个初始化参数可以是一切对象!)

class A(object):
 def instense(self):
  print("init obj A")
  
class B(object):
 def __init__(self, para):
  self.init_para = para
  self.obj_A = A()
  self.num = 1
 
 def show(self):
  print(self.init_para)
  self.obj_A.instense()
  print(self.num)
haha = B("this is para")
haha.show()

----------
this is para

init obj A

1

析构方法:

__del__:销毁实例时,方法才会执行。

class Hello(object):
    def __del__(self):
        print("你删除了实例")
# 在python上测试
instance = Hello()
del instance
# 当然也可以使用实例调用,但没有这么用的~~
instance.__del__()

  自定义方法:

除去类中自带的以_下划线开头的函数,在类中定义一个函数,实现相应的功能。

class Person(object):
    def __init__(self,person_name, person_age)

静态方法:

    @staticmethod,不需要访问类里的任何参数。所带的参数都是从外部传入的。

class Person(object):
    def __init__(self,person_name, person_age):
        self.name = person_name
        self.age = person_age
        
    @staticmethod
    def info(country):
        print(country)

类方法:

   @classmethod,第一个参数必须是类属性。

class Person(object):
    country = "china"
    def __init__(self,person_name, person_age):
        self.name = person_name
        self.age = person_age
        
    @classmethod
    def info(country):
        print(country)

属性方法:

    @property把一个函数变成一个静态属性

直接调用函数名字,不需要加括号,就能获取到函数返回值。一般用在不注重过程,只要结果的情况!

class Person(object):
    country = "china"
    def __init__(self,person_name, person_age):
        self.name = person_name
        self.age = person_age

    @property
    def health_point(self):
        print("HP:【{}】".format(self.age*2))
        return self.age*2

P = Person("laowang",23)
P.health_point                # 不需要括号,看起来完全是一个属性,这就是属性方法

特殊成员方法:

方法 作用 示例 结果
__call__
默认未定义

类实例化后,调用实例运行的方法


p = Person()

p()


Person是类名

实例p没有调用函数,加()运行call方法

__str__
默认未定义,定义时必须有返回值

定义时,打印实例,输入str返回值


p = Person()

print (p)


Person是类名

打印实例p,运行str方法,打印返回值

__getitem__ 用于索引操作,如字典。获取数据
p = Person()

p['name']

自动运行getitem
__setitem__ 用于索引操作,如字典。赋值
p = Person()

p['name'] = 'David'

自动运行setitem
__delitem__ 用于索引操作,如字典。删除数据
p = Person()

del p['name']

自动运行delitem
__new__
类实例化时,执行__new__,并且会阻止

init运行,可以在new里调用init

p = Person() 参照例子二
__len__ 待续
__cmp__ 待续
'''例子一call\str\getitem\setitem\delitem方法'''
class Person(object):
 def __call__(self):
  print("print call")
 
 def __str__(self):
  print("print str:",end='')
  return "1"
  
 def __getitem__(self,key):  
  print("getitem:",key)
  
 def __setitem__(self,key,value):
  print('setitem:',key,value)
 
 def __delitem__(self,key):
  print('delitem:',key)
  
p = Person()
p()
print(p)
print('-----------')
get = p['name']
p['name'] = 'David'
del p['name']
'''例子二:__new__/__init__'''
class Person(object):

 def __init__(self):

  print('this is init!')
  

 def __new__(self):

  print("this is new!")

  self.__init__(self)        # 如果去掉这一行,init不能执行
  
p = Person()

 类的来源和元类:

http://blog.jobbole.com/21351/中文版详细解答。下面写一个自己理解的简版的。

首先,类也是对象,可以:

1)   你可以将它赋值给一个变量

2)   你可以拷贝它

3)   你可以为它增加属性

4)   你可以将它作为函数参数进行传递

类也是是由type()这个函数创建的,type是类的类,类的爹。学名叫元类!

也许有人会问那为啥type()能查看到数据类型呢?因为数据类型在Python中都是类定义的,这也说明了,为什么数字,字符等等全是对象。

type格式:

type(类名,(父类元组),{属性字典},{方法词典})  ,  父类元组可以没有;后面两个典省略时,默认值为None。

'''一言不合就上例子'''
class Person(object):
    country = 'china'

Person = type('Person',('object',),{'country':china})

未完待续。。。

  • 类的继承
  • 类的多态
  • 反射

原文地址:http://blog.51cto.com/yishi/2072182

时间: 2024-11-08 10:39:38

Python基础:Python类(真累~)的相关文章

Python基础-Python流程控制

上篇文章 Python基础-基础使用 我们已经知道了Python解释器,Python的变量.和Python的输入输出.Python的注释和字符集,这篇文章,我们主要讲Python的流程控制 本文防盗链:http://python789.blog.51cto.com Python基础-Python流程控制 1.条件判断 1.1.if基本使用 if就是一个条件判断的,当满足不同样的条件的时候执行不同的操作,如法如下: if 条件1:     满足条件1 代码框 elif 添加2:     满足条件2

python基础----&gt;python的使用(三)

今天是2017-05-03,这里记录一些python的基础使用方法.世上存在着不能流泪的悲哀,这种悲哀无法向人解释,即使解释人家也不会理解.它永远一成不变,如无风夜晚的雪花静静沉积在心底. Python的基础学习 一.python中函数作为参数 import math def add(x, y, f): return f(x) + f(y) print(add(25, 9, math.sqrt)) # 8.0 二.python引用自定义模块 在同目录下面定义两个文件huhx.py和huhx5.p

重学Python - Day 05 - python基础 -&gt; python的文件操作:r、w、a、r+、a+ 、readline、readlines 、flush等常用的文件方法

文件的读操作 示例: 1 print("->文件句柄的获取,读操作:") 2 3 f = open('无题','r',encoding='utf8') 4 d = f.read() 5 f.close() 6 print(d) 7 8 print('->例二:') 9 f = open('无题','r',encoding='utf8') 10 e = f.read(9) 11 f.close() 12 print(e) 13 #python3中,文件中一个中英文都占位1 运

重学Python - Day 01 - python基础 -&gt; python版本选择+第一个小程序

题外话: Python版本:最新的3.6 安装注意点:勾选添加路径后自定义安装到硬盘的一级目录,例如本人的安装路径: F:\Python 原因:可以自动添加python环境变量,自动关联.py文件,其余的优点很多,例如学习selenium的,使用pip install selenium命令就可以安装selenium 3了,虽然python webdriver的自动化还是2.7居多,但是3.0会是未来 闲言碎语以后再说,现在正式开始学习Python,没办法,不会编程的测试在工作中好吃力,学不会py

Python基础(十一) 类继承

类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类,可以有多个子类: 子类,一旦继承父类,就拥有了父类的属性与方法,根据需要可以进行增删改. 这种做法的主要好处之一就是代码重用. 示例代码1: #*_*coding:utf-8*_* class perent_class(object): def __init__(self,name): self.n

python基础===新式类与经典类

首先: Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式的继承object 这两种类的区别: 新式类重定义的方法更多,当然这不是重点,重点是两种类在多继承状态下查找"方法"的规则不同. 经典类: 深度查找 显示类:广度查找 其次: ------新式类对象可以直接通过__class__属性获取自身类型:type ------继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;

Python基础20_类的约束,异常处理,MD5加密,日志

一. 类的约束 约束程序的结构, 在分配任务之前就应该把功能定义好, 然后分别交给底下的程序员来完成相应的功能 在python中有两种办法来解决这样的问题 1. 提取父类, 然后在父类中定义好方法, 在方法中抛出一个异常, 这样所有继承父类的子类都必须重写这个方法, 否则访问的时候就会报错 class Base: def login(self): raise NotImplementedError   # 没有被实现错误, 要求子类必须重写login方法 , 不然抛出异常 class User(

Python基础13_类与类型, MRO, C3算法, super()

一. python多继承 类与类型:http://www.cnblogs.com/blackmatrix/p/5594109.html 子类继承了多个父类, 当父类出现了重名方法时, 这时就涉及到查找父类方法的问题, 即MRO(method resolution order)问题 python中有两种类, 经典类和新式类 在Python2及以前的版本中,由任意内置类型派生出的类(只要一个内置类型位于类树的某个位置),都属于"新式类",都会获得所有"新式类"的特性:反

【python基础】类&amp;对象

一.类 1.对同一类事物抽象的描述,抽象的概念 2.定义类的语法: class 关键字——命名规则:大驼峰StudentInfo; (小驼峰studentInfo) class 类名: pass 3.属性: 理解为用于描述类名词 (名字, 年龄, 颜色, 身高,...) 4.方法: 也叫做函数, 理解为类能够实现的行为功能(吃饭, 睡觉, 打豆豆,...) 二.对象: 真实存在的,类的具体的一个实例 1.对象 : 也叫做实例 2.创建对象的过程:叫做类的实例化 3.对象.方法() 获取对象的属性

Python基础---Python介绍

python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 2017年最新的TIOBE排行榜,Python已由去年的第五上升到第四, Python崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析.组件集成.网络服