实例化过程

1、类的定义和语法

class dog(object):   #用class定义类
"dog class" #对类的说明 def __init__(self,name): #构造函数或者是构造方法,也可以叫初始化方法
self.name = name def sayhi(self): #类方法
"sayhi funcation" #对类方法的说明
print("hello,i am a dog,my name is ",self.name) d = dog("AAAA") #定义一个d的对象,叫实例
d.sayhi() #调用实例的方法

2、self关键字是个什么鬼

其实self 这个关键字相当于实例化对象本身(self相当于d),在实例化过程中,把自己传进去了,我们队上面的两行做一下解释

3、函数__init__() 、__del__()

在类中__init__()函数叫构造函数,又叫构造方法,也可以叫初始化函数。它的作用就是初始化实例时,初始化传入实例的的默认值。如果不写__init__(),就会调用的默认为空的__init__(),说白了,这个方法不管你写不写,都会调用,而且,一旦实例化就会调用。

class dog(object):
"dog class" def __init__(self,name): #构造方法,不写调用默认的构造方法
self.name = name def eat(self,food):
print("the dog name is {0},it like food is {1}".format(self.name,food)) d = dog("AAAA")
d.eat("hotdog")
#输出
the dog name is alex,it like food is hotdog

在类中__del__()函数叫做析构函数,是在实例销毁的时候调用的函数

class dog(object):
"dog class" def __init__(self,name):
self.name = name def sayhi(self):
print("the dog {0} is sayhi".format(self.name)) def __del__(self): #定义析构函数
print("del.....run...") d = dog("alex")
del d
import time
time.sleep(5) #输出
del.....run...

①析构函数说明时候调用呢?

其实每一个对象都是一个应用,就像每一个房间都有门牌号一样, 只要这个对象的引用被清空时,就会自动执行,就像上面的del d,其实python中有自动垃圾回收机制,会定时去的去回收一些被清空的应用,而析构函数就是在引用被清空之后会自动执行

②析构函数的作用?

比如说server端接受很多客户端的连接,当你手动屏蔽你的sever端的时候,这个时候客户端还在正常的连接,如果sever端用类写的,你就可以delete server端的同时,在__del__()写一些东西,说去close掉很多客户端的连接。说白了,析构函数就是做一些程序的收尾工作。

4、类的实例化过程图解:

小结:

  • 其实self,就是实例本身!你实例化时python会自动把这个实例本身通过self参数传进去。
  • 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
  • __init__()构造函数
  • self.name = name 被称为属性、成员变量、字段
  • def sayhi(self)  被称为方法、动态属性

5、访问类属性

class dog(object):
"dog class" def __init__(self,name):
self.name = name #类的成员变量 def sayhi(self):
print("the dog {0} is sayhi".format(self.name)) def eat(self,food): #传入一个参数,参数名:food
print("the dog name is {0},it like food is {1}".format(self.name,food)) d = dog("AAAA") #实例化对象
d.sayhi() #调sayhi方法
d.eat("hotdog") #调eat方法 #输出
the dog alex is sayhi
the dog name is alex,it like food is hotdog

①为什么eat方法里面会传入一个food的参数名呢?而这个为什么不能再其他方法里面用呢?而self.name就可以呢?

因为food它只是作为eat方法的一个参数,不是类的成员变量,只能在自己的方法里面使用,而self.name是类的成员变量,它是类的属性,所以可以被调用。

②为什么类的每一个方法第一个参数都是self呢?

是因为类在实例化的时候,需要把实例对象本身传进来,好去调用对象本身的属性和方法

6、修改类属性

class dog(object):
"dog class" def __init__(self,name,age):
self.name = name
self.age = age def sayhi(self,update_age): #传入一个update_age参数
self.age = update_age #修改对象的age属性 d = dog("AAAA",18)
d.sayhi(22) #第1次在类的方法中修改
print(d.age)
d.age = 19 #第2次在类外面修改
print(d.age) #输出
22
19

注:就是说在类的方法中或者类的外面都可以修改类的属性

7、私有属性

 定义私有属性

class dog(object):
"dog class" def __init__(self,name,age):
self.name = name
self.age = age
self.__sex = "man" #定义私有属性__sex def sayhi(self,update_age):
self.age = update_age d = dog("AAAA",18)
print(d.__sex) #访问私有属性__sex #输出
Traceback (most recent call last):
File "E:/PycharmProjects/pythontest/day6/封装.py", line 16, in <module>
print(d.__sex)
AttributeError: 'dog' object has no attribute '__sex' #报错,说没有__sex这个属性

上面的例子可以看出,私有属性是不可以访问的,更不可以修改。但是我们就想访问,但是不去修改,我们怎么办呢?

get方法访问私有属性

class dog(object):
"dog class" def __init__(self,name):
self.name = name
self.__sex = "man" #定义私有属性sex
def get_sex(self): #定义get方法
return self.__sex #返回私有属性sex值 d = dog("AAAA")
d_sex = d.get_sex() #调用实例对象d的get_sex()方法获取私有属性sex
print(d_sex) #输出
man

注:这种方法只能访问私有属性,但是不能更改私有属性

强制访问私有属性

class dog(object):
"dog class" def __init__(self,name):
self.name = name
self.__sex = "man" #定义私有方法sex d = dog("AAAA")
print(d._dog__sex) #访问私有属性sex
d._dog__sex = "woman" #修改私有属性sex
print(d._dog__sex) #打印修改后的值
#输出
man
woman

注:这种方法就更为暴力,可以访问也可以修改,就是:对象名._类名__属性名

8、公有属性

定义公有属性:在类中直接定义的,可以提供这个类所属的所有对象都可以访问的属性

class dog(object):
"dog class" nationality = "JP" #定义公有属性nationality def __init__(self,name):
self.name = name d1 = dog("AAAA")
d2 = dog("sanjiang")
print(d1.nationality,d2.nationality) #所有的成员变量都可以访问 #输出
JP JP

d1.name,d2.name也可以访问,也可以修改, 为什么不能叫公有属性呢?

class dog(object):
"dog class" nationality = "JP" def __init__(self,name):
self.name = name d1 = dog("AAAA")
d2 = dog("sanjiang")
print(d1.name,d2.name) #输出
alex sanjiang

注:上面的name是每个对象的属性,并不是共享,而是独立的 ,所以不能叫做公有属性

 访问/修改公有属性

class dog(object):
"dog class" nationality = "JP" #定义公有属性 def __init__(self,name):
self.name = name d1 = dog("AAAA")
d2 = dog("sanjiang")
print(dog.nationality) #访问公有属性
dog.nationality = "US" #修改公有属性
print(dog.nationality) #输出
JP
US

注 :公有属性不仅可以通过所属类的所有对象访问,还可以通过类本身直接访问和修改

公有属性特性

公有属性不是私有属性,它提供所有对象访问和修改,那我们其中有一个对象正在修改公共属性发生什么变化呢?

class dog(object):
"dog class" nationality = "JP" def __init__(self,name):
self.name = name d1 = dog("AAAA")
d2 = dog("sanjiang")
print("firsthand change...")
print(d1.nationality,d2.nationality)
print("brfore change ...")
d1.nationality = "CN" #对象的d1修改公共属性得值
print(d1.nationality,d2.nationality)
print("after change ....")
dog.nationality = "US" #dog类本省修改公共属性的值
print(d1.nationality,d2.nationality) #输出
firsthand change...
JP JP
brfore change ...
CN JP #d1对象的公共属性被修改了
after change ....
US US #d1对象的公共属性值没有随着类本身的公共属性值修改而修改

解疑:

  1. 对象d1去访问nationality属性时,如果在成员属性中找不到,就会找公共属性,也就是说自己的属性找不到就去找父亲的属性
  2. d1.nationality="CN" 相当于在自己对象内部又重新创建了一个新的局部变量,这个局部变量已经脱离了class本身,跟这个类已经没有半毛钱关系了,只是名字一样而已,如果不改,还是找全局的。

【python】-- 类的实例化过程、特征、共有属性和私有属性的更多相关文章

  1. Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性

    类属性.实例属性和私有属性 Python中类的属性主要包括类属性,实例属性和私有属性,下面是对三种属性的简单介绍 类属性 / Class Property 类属性在__init__()之外初始化,在外 ...

  2. python基础-类的属性(类属性,实例属性,私有属性)

      一:类的属性 类的属性分为:类属性(公有属性),实例属性和私有属性. 1)类属性(公有属性(静态字段): 类定义时直接指定的属性(不是在__init__方法中),可以通过类名直接访问属性,并且保存 ...

  3. 洗礼灵魂,修炼python(33)--面向对象编程(3)—特殊类方法__init__,公有属性,私有属性

    在上一篇博文里,传入参数时,是在实例化对象后且在调用方法时才传入参数,感觉是不是有点繁琐对吧?可以在实例化的时候就传入参数吗?可以的,这就是本篇博文的要讲到的构造器——__init__(两边双下划线) ...

  4. day16-封装(私有静态属性、私有属性、私有方法、类方法、静态方法)

    # 一: class P: __age = 30 #私有静态属性 def __init__(self,name): self.__name = name #私有属性:属性名前面加上双下划线是私有属性. ...

  5. 面向对象【day07】:类的实例化过程剖析(三)

    本节内容 1.概述 2.类的语法 3.总结 一.概述 之前我们说关于python中的类,都一脸懵逼,都想说,类这么牛逼到底是什么,什么才是类?下面我们就来讲讲,什么是类?它具有哪些特性. 二.类的语法 ...

  6. Python类(一)-实例化一个类

    #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(): n = 123 #类变量 def __init_ ...

  7. Python:类属性,实例属性,私有属性与静态方法,类方法,实例方法

    From: http://www.cnblogs.com/pengsixiong/p/4823473.html 属性分为实例属性与类属性 方法分为普通方法,类方法,静态方法 一:属性: 尽量把需要用户 ...

  8. Python - 面向对象编程 - 公共属性、保护属性、私有属性

    公共属性 在 Python 的类里面,所有属性和方法默认都是公共的 class PoloBlog: # 公共属性 sum = 0 # 构造方法 def __init__(self, name): se ...

  9. 控制 Python 类的序列化过程

    问题 有的类是不支持在多进程间传递的,如果非要这么做,可能会引发奇怪的现象.比如下面这段代码: from concurrent.futures import ProcessPoolExecutor, ...

随机推荐

  1. 数据库字段名称转java字段名称

    /** * * @Title: changeToJavaFiled * @Description: TODO(将数据库中带下划线的字段转换为Java常用的驼峰字段) * @param @param f ...

  2. ECSHOP生成缩略图模糊

    原因是因为ECSHOP生成缩略图时,用到的函数 imagejpeg()  没有设置质量参数.注释:质量参数为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大).如果没有设置质量参 ...

  3. 2017.7.31 ELK+logback+redis的使用

    参考来自:spring mvc+ELK从头开始搭建日志平台 0 前提 ELK安装成功 redis安装成功 使用logback的项目运行成功 1 配置文件 1.1 pom.xml 为了使用logback ...

  4. EffectiveJava(7)避免使用终结方法

    避免使用终结方法 1.使用终结方法会导致行为不稳定,性能降低,以及可移植性的问题.(终结线程的优先级过低) 终结方法不能保证被及时的执行(从一个对象变得不可到达开始,到中介方法被执行,所花费的时间是任 ...

  5. js - 正斜杆网址转换

    2018-8-7(更新) let http = 'http://www.baidu.com/com/img/1.jpg'; let https = 'http:\\www.baidu.com\\com ...

  6. 安装Linux centos 时编辑选项

    将第上一步选择编辑之后出来的文字修改为:>vmlinuz initrd=initrd.img linux dd quiet 这里注意了:网上很多文章都说这一步改成“>vmlinuz ini ...

  7. 工作总结 sql 中过滤条件 中的 (where中的) and

    总结: 在where 后面做过滤的时候 如果  有 字段1 必须满足某种值   字段2 要满足 某种或某值的时候  直接   and 字段1 = ‘a’   and    字段2 = ‘b’ or 字 ...

  8. [DevExpress]TreeListLookUpEdit带checkbox之经典运用

    上代码: public partial class TreeListLookUpEdit : DevExpress.XtraEditors.XtraForm { private string _Key ...

  9. mac 下 pycharm 快捷键

    用过快捷键立即感觉高大上了,最主要的是很方便啊!很强大 cmd b 跳转到声明处(cmd加鼠标) opt + 空格 显示符号代码 (esc退出窗口 回车进入代码) cmd []光标之前/后的位置 op ...

  10. 最常用的几个python库--学习引导

    核心库 1.NumPy 当我们用python来处理科学计算任务时,不可避免的要用到来自SciPy  Stack的帮助.SciPy Stack是一个专为python中科学计算而设计的软件包,注意不要将它 ...