简述Python中的类与对象

Python中的类

类的定义

示例:

class Person:
    country = "China"
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def speak(self, word):
        print(word)

其中 country 是类属性,即 Person类 的静态属性,speak() 为 Person类的函数属性,即类的动态属性~

类的实例化

对上述示例的类进行实例化:

>>> p = Person(‘Kitty‘, 18)       # 实例化 Person类,得到对象 p
>>> p.name                              # 调用对象 p 的name属性
‘Kitty‘
>>> p.speak(‘hello‘)                 # 调用对象 p 的绑定方法
hello

?
类中的 __init__ 方法用于初始化对象,而在类的是实例化过程中,对应类中第一个被调用的并不是 __init__ 方法,第一个被调用的是 __new__方法。在对象的初始化之前首先要创建对象,__new__方法正是用来创建这个对象~
?
类的实例化过程也可以通过如下语句来实现:

>>> p = object.__new__(Person)        # __new__方法继承自 object类
>>> Person.__init__(p, ‘Kitty‘, 18)
>>> p.name
‘Kitty‘

在Person类中重写 __new__方法:

class Person:
    country = "China"
    def __new__(cls, name, age):
        print(‘__new__ called‘)
        return super(Person, cls).__new__(cls)

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

    def speak(self, word):
        print(word)

p = Person(‘Kitty‘, 18)          # 实例化对象
print(‘name : %s‘ % p.name)

# 输出结果:
__new__ called
name : Kitty

很明显 __new__方法 是先于 __init__ 方法被调用的~
类的实例化过程大致步骤如下:
1、p = Person(‘Kitty‘, 18) ,会调用 Person类的__new__方法,并传递 name 和 age 参数
2、__new__方法 会创建一个 Person类的对象并返回
3、最后利用这个对象调用类的 __init__ 方法 完成初始化,__init__ 方法的第一个参数是self,对象在调用 __init__ 方法时会将自己当做参数传递给 这个self。
?
注意:__init__方法没有返回值~,__init__ 方法仅完成对象的初始化工作~
?

self是什么?
在类的内部,self 就是一个对象。使用对象调用方法时(对象的绑定方法),当前对象会被自动传递给 self,即 self 表示调用该方法的对象~

类属性的调用

操作类的变量属性:

>>> Person.country                  # 调用类属性
‘China‘
>>> Person.country = ‘USA‘     # 修改类属性
>>> Person.country
‘USA‘
>>> del Person.country           # 删除类属性
>>> Person.country                 # 删除后无法再调用
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object ‘Person‘ has no attribute ‘country‘

?
调用类的函数属性:
这里仅介绍绑定方法的调用(即第一个参数是self的方法),类中的其他方法暂先不做介绍~
?
speak() 是类的函数属性,对象调用不需要传递 self参数(对象调用 会自动完成self参数传值,下面会介绍),若是类来调用,则需要手动传递这个 self参数,即需要传递一个Person类的对象~

class Person:
    country = "China"

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

    def speak(self, word):
        print(word)

p = Person(‘Kitty‘, 18)
p.speak(‘hello‘)                  # 对象调用,会自动将 对象p 作为第一个参数传递给 self
Person.speak(p, ‘你好‘)     # 类调用需要手动传递 self 的值

# 输出结果:
hello
你好

类的名称空间

类名.__dict__ 用来查看一个类(或对象)的名称空间,可以这样理解。其实__dict__是类的一个内置属性,存储所有实例共享的变量和函数(类属性,方法等),类的__dict__并不包含其父类的属性。对象中的 __dict__ 属性下面会介绍~
?
这里注意和 dir() 方法的区别,dir(类名或对象名) 会返回一个类(或对象)的所有属性,包括从父类中继承的属性。

Person类的__dict__属性
{‘__module__‘: ‘__main__‘,        # 所处模块
‘__init__‘: <function Person.__init__ at 0x11023b378>,   # __init__方法
‘speak‘: <function Person.speak at 0x11023b400>,       # speak 方法
‘__dict__‘: <attribute ‘__dict__‘ of ‘Person‘ objects>,      # 应该就是指  类的__dict__属性,具体参阅:https://blog.csdn.net/lis_12/article/details/53519060
‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Person‘ objects>,
‘__doc__‘: None}             # # class说明文档

?
调用类的属性,首先会去类的名称空间中(Person.__dict__)寻找对应名称的key,相当于Person.__dict__[‘country‘],也可以直接这样调用:

>>> Person.__dict__[‘country‘]
‘China‘
>>> Person.__dict__[‘country‘] = ‘USA‘
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ‘mappingproxy‘ object does not support item assignment

?
注意:
__dict__ 对于类中的属性只能查看,不能修改~

Python内置属性

除了 __dict__,Python中的类还有很多别的内置属性:
__doc__ :类的说明
__name__: 类名
__module__: 类定义所在的模块
__bases__ : 包含了类的所有父类 的元组
?
示例如下:

class Person:
    ‘‘‘human being‘‘‘
    country = "China"

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

    def speak(self, word):
        print(word)

print(Person.__doc__)
print(Person.__name__)
print(Person.__module__)
print(Person.__bases__)

#结果输出:
human being
Person
__main__
(<class ‘object‘>,)

Python中的对象

对象的名称空间

class Person:
    country = "China"

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

    def speak(self, word):
        print(word)

实例化一个Person类的对象 的过程中,init方法会将参数赋值给 name 与 age 属性,可以通过 实例的__dict__ 查看,注意:实例的__dict__ 仅存储与该实例相关的实例属性,没有函数属性,也没有共有属性~

>>> p = Person(‘Kitty‘, 18)
>>> print(p.__dict__)
{‘name‘: ‘Kitty‘, ‘age‘: 18}

?
注意 实例.__dict__ 与 类.__dict__ 的区别~
?
通过 类.__dict__ 可以查看类中的属性,但是不能修改,但是通过 实例.__dict__ 除了查看,还可以进行修改~

>>> p.__dict__[‘name‘]
‘Kitty‘
>>> p.__dict__[‘age‘]
18
>>> p.__dict__[‘name‘] = ‘abc‘
>>> p.__dict__[‘age‘] = 20
>>> p.name
‘abc‘
>>> p.age
20

对象的变量属性调用

通过对象可以直接调用该对象的变量属性,例如 p对象 的 name属性 和 age属性~

>>> p = Person(‘Kitty‘, 18)
>>> p.name
‘Kitty‘
>>> p.age
18

也可以通过 p对象 调用对应类(这里是Person类)的变量属性,若是类的变量属性发生变化,则所有对象获取到的类变量属性都会改变~

>>> p.country
‘China‘

>>> Person.country = ‘UK‘       # 修改 类的变量属性
>>> p2 = Person(‘baby‘, 22)
>>> p.country
‘UK‘
>>> p2.country
‘UK‘

Tip:

  • 可以将所有类共有的属性设置成类属性;
  • 对象寻找属性会先在自己的名称空间中寻找,若是没有再去类的名称空间中寻找~

注意1
在修改类的变量属性时,若变量是不可变类型,则仅能通过 类名.变量属性 来修改,如下示例:

>>> Person.country = ‘USA‘     # 修改类属性
>>> p.country
‘USA‘
>>> p.country = ‘UK‘
>>> p.country
‘UK‘
>>> Person.country
‘USA‘
>>> p2.country
‘USA‘

p.country 并没有修改类属性,而是给自己添加了一个新的属性,这个新添加的属性存放在对象自己的名称空间中,类的变量属性 country 并没有发生改变~

>>> p.__dict__
{‘country‘: ‘UK‘, ‘age‘: 20, ‘name‘: ‘abc‘}

?
在类中 self 表示当前调用的对象,当 self 引用的变量和类变量同名的时候,需要注意区分:这两个变量之间没有关联,self 引用的变量属于对象,放在对象的名称空间中,类变量则放在类名称空间中

class Person:
    country = "China"
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.country = ‘AUS‘     # 添加对象属性
    def speak(self):
        print(self.country)
############
>>> p = Person(‘Kitty‘, 18)
>>> p.country
‘AUS‘
>>> p.speak()
AUS
>>> Person.country
‘China‘

注意2
当类变量为可变类型时,需要区分对象的 2种 操作:

class Person:
    country = "China"
    lst = []
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.lst.append(name)
    def speak(self):
        print(self.name)
############
>>> p = Person(‘Kitty‘, 18)
>>> p.__dict__
{‘age‘: 18, ‘name‘: ‘Kitty‘}
>>> Person.lst
[‘Kitty‘]

上述示例中,self 针对 lst 变量并不是一个赋值操作,而是调用了 lst的append方法,所以这个过程会先在对象的名称空间中寻找 lst 属性,对象的名称空间中没有,然后再去类的名称空间中寻找,Person类中存在该属性,于是调用其 append 方法。
?
这个过程通过对象修改了类的可变类型的变量~
?
若 self 针对 lst 变量是一个赋值操作,这样就为当前对象新增了一个 lst 属性

class Person:
    country = "China"
    lst = []
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.lst = name
    def speak(self):
        print(self.name)
############
>>> p = Person(‘Kitty‘, 18)
>>> p.__dict__
{‘age‘: 18, ‘name‘: ‘Kitty‘, ‘lst‘: ‘Kitty‘}
>>> Person.__dict__
{‘__module__‘: ‘__main__‘, ‘country‘: ‘China‘, ‘lst‘: [], ‘__doc__‘: None, ‘__init__‘: <function __init__ at 0x105f5fc08>, ‘speak‘: <function speak at 0x105f5c0c8>}

对象的方法(绑定方法)

class Person:
    country = "China"
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def speak(self):
        print(self.name + ‘, ‘ + str(self.age))
############
>>> p1 = Person(‘Kitty‘, 18)
>>> p2 = Person(‘baby‘, 22)
>>> p1.__dict__
{‘age‘: 18, ‘name‘: ‘Kitty‘}
>>> p2.__dict__
{‘age‘: 22, ‘name‘: ‘baby‘}

可以看到对象的名称空间中没有函数属性,函数属性在类的名称空间当中
?

>>> Person.speak
<unbound method Person.speak>
>>> p1.speak
<bound method Person.speak of <__main__.Person instance at 0x105f727a0>>
>>> p2.speak
<bound method Person.speak of <__main__.Person instance at 0x105f728c0>>

p1 和 p2 的 speak 方法为绑定方法(bound method),且 p1 和 p2 的 speak 方法内存地址不一致,这两个对象的 speak 方法都执行 类中对应的方法。
?
通过对象调用绑定方法的时候,会自动将 当前对象传递给方法的第一个参数(self,一般都叫self,也可以写成别的名称),若使用类调用,则第一个参数需要手动传值~

>>> p1.speak()
Kitty, 18
>>> p2.speak()
baby, 22
>>> Person.speak(p1)     # 通过类调用
Kitty, 18

这里仅对绑定到对象的方法做简单介绍,类中还有绑定到类的方法,还有非绑定方法等...,之后会介绍

.................^_^

原文地址:http://blog.51cto.com/ljbaby/2341332

时间: 2024-10-31 09:23:04

简述Python中的类与对象的相关文章

python中的类和对象,属性和方法

一.面向对象的概述面向对象是一种描述业务问题.设计业务实体和实体之间关系的方法二.类和对象1.类和对象得区别:类是对客观世界中事物得抽象,而对象是类实例化后的实体   例如:汽车模型就是一个类,制造出来的每辆汽车就是一个对象2.类的定义:   (1)python使用class关键字定义一个类,类名的首字母一般要大写:       例如: class Student: #定义了一个Student类   (2)类的主体由一系列的属性和方法组成       例如: class Fruit: #定义一个

Python 中的类与对象 初认识

一:类的声明 1类的关键字: 从第一天第一个项目起我们就接触过关键字,比如False True is not None return for while elif else import等等,这是语言中内定的一个语法规则吧,通过关键字告诉电脑下面一个字母或一段 代码是什么,要用来干什么,告诉电脑怎么以哪种规则去用. 而class就是类的关键字,告诉系统我要定义一个类了.让系统用理解类的规则来理解我下面 的一些代码.没有关键字来声明一下,系统就不知道下面的代码是什么. 2.标识符: 标识符就是用来

python中的类和对象

类和对象 1. 类和对象和概念 类:共性事物的抽象,是对某一类具有共同事物的描述,是具有相同属性和方法的集合 对象:类的实例,是共性事物的一个体现,是这类事物中的每个个体 2. 总结: 类是对象的模板,对象是类的实例 3. 创建类的语法 class Math: #类名一般首字母大写 a = 4 #属性 b = 5 def add(self): c = self.a + self.b return c 注意: 类名一般首字母大写,比如class User ,其中class是关键字 类里面包含属性(

python中的类与对象

一.类的概念 首先,我们先来说说什么是类.看了很多关于python类的介绍,大多都介绍如何使用,但是对于概念却一笔带过,一个初学编程的小伙伴很难理解. 概括的说:类可以比作是某种类型集合的描述.然而这对于初学者来说并没有什么卵用.记得我在书上看到这部分的时候,书上是这样说的:类是一类事物的抽象,我盯着看了半天之后放弃了学习. 今天就来详细的说说: 我们把一类相同的事物,用相同的属性描述,里面封装了相同的方法,就叫做类. 二.对象的概念

使用C语言为python编写动态模块(3)--在C中实现python中的类

楔子 这次我们来介绍python中的类型在C中是如何实现的,我们在C中创建python的int对象,可以使用PyLong_FromLong.创建python的list对象可以使用PyList_New,那么如何在C中构建一个python中的类呢? 对于构建一个类,我们肯定需要以下步骤: 创建一个类扩展 添加类的参数 添加类的方法 添加类的属性,比如可以设置.获取属性 添加类的继承 解决类的循环引用导致的内存泄露问题和自定义垃圾回收 前面几个步骤是必须的,但是容易把最后一个问题给忽略掉.我们在pyt

Python中常见的文件对象内建函数

文件对象内建方法列表 文件对象的方法 操作 file.close() 关闭文件 file.fileno() 返回文件的描述符(file descriptor,FD,整数值) file.flush() 刷新文件的内部缓冲区 file.isatty() 判断file是否是一个类设tty备 file.next() 返回文件的下一行,或在没有其它行时引发StopIteration异常 file.read(size=-1) 从文件读取size个字节,当未给定size或给定负值时读取剩余的所有字节,然后作为

Python中元类

一. 前提: python中一切都是对象,要么是类的对象,要么是元类的对象,type元类是自己的对象.继承层次表示为type(元类)-->类(内置和用户自定义的) --> 类的实例. 二.  目的: 创建类时自动改变类,换句话说就是创建类这种东西的东西. 三.  __metaclass__ 可以通过指定__metaclass__来使用用户自定义的元类创建类. class语句解析顺序: class Myclass(object): pass Myclass里面的__metaclass__ --&

浅析python中的类变量和对象变量

刚学python,学到了有关于类和对象的地方.对一个概念有点模糊,后来通过实践编码找到一定规律 在python中 class test(object): id=2 name='tt' list=['tt','dd'] def change(self,newA,new_id): self.id=new_id self.age=newA return self.age t1 = test() t1.change(21, 3) print t1.id #3 t2 = test() t2.age = 2

Python中的类(上)

在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. 例如,下面创建了一个Student的类,并且实现了这个类的初始化函数"__init__": class Student(object): count = 0 books = [] def __init__(self, name, age): self.name = name self.age = age pass 接下来就通过上面的Student类来看看Python中类的相关内容. 数据属性