python入门第二十四天----成员修饰符 类的特殊成员

1 #成员修饰符  修饰符可以规定内部的字段、属性、方法等 是共有的成员,私有的成员
2 class Foo:
3     def __init__(self,name,age):
4         self.name=name
5         self.age=age  #可以在外部直接访问
6
7 obj=Foo(‘Jack‘,22)
8 print(obj.name)
9 print(obj.age)

共有字段

1 #成员修饰符  修饰符可以规定内部的字段、属性、方法等 是共有的成员,私有的成员
2 class Foo:
3     def __init__(self,name,age):
4         self.name=name
5         #self.age=age  #可以在外部直接访问
6         self.__age=age #添加 __ 两个下划线,就变成私有字段,外部不能访问
7 obj=Foo(‘Jack‘,22)
8 print(obj.name)
9 print(obj.age)

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
Traceback (most recent call last):
Jack
  File "F:/python从入门到放弃/7.24/面向对象.py", line 16, in <module>
    print(obj.age)
AttributeError: ‘Foo‘ object has no attribute ‘age‘

Process finished with exit code 1

私有字段外部不能直接访问。可以通过内部的方法,间接访问

 1 #成员修饰符  修饰符可以规定内部的字段、属性、方法等 是共有的成员,私有的成员
 2 class Foo:
 3     def __init__(self,name,age):
 4         self.name=name
 5         #self.age=age  #可以在外部直接访问
 6         self.__age=age #添加 __ 两个下划线,就变成私有字段,外部不能访问
 7     def get_age(self):
 8         return self.__age
 9 obj=Foo(‘Jack‘,22)
10 print(obj.name)
11 print(obj.get_age())

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
Jack
22

Process finished with exit code 0

 1 #成员修饰符  修饰符可以规定内部的字段、属性、方法等 是共有的成员,私有的成员
 2 class Foo:
 3     gender=‘男‘ #对于静态字段
 4     def __init__(self,name,age):
 5         self.name=name
 6         #self.age=age  #对于普通字段可以在外部直接访问
 7         self.__age=age #添加 __ 两个下划线,就变成私有字段,外部不能访问
 8     def get_age(self):
 9         return self.__age
10 obj=Foo(‘Jack‘,22)
11 # print(obj.name)
12 # print(obj.get_age())
13 print(obj.gender)

静态字段

 1 class Foo:
 2     #gender=‘男‘ #对于静态字段
 3     __gender = ‘男‘
 4     def __init__(self,name,age):
 5         self.name=name
 6         #self.age=age  #对于普通字段可以在外部直接访问
 7         self.__age=age #添加 __ 两个下划线,就变成私有字段,外部不能访问
 8     def get_age(self):
 9         return self.__age
10     def get_gender(self):
11         return Foo.__gender
12 obj=Foo(‘Jack‘,22)
13 # print(obj.name)
14 # print(obj.get_age())
15 print(obj.get_gender())

私有静态字段

 1 class Foo:
 2     __gender=‘男‘
 3     def __init__(self):
 4         pass
 5
 6     # def get_gender(self):
 7     #     return Foo.__gender
 8
 9     @staticmethod
10     def get_gender():
11         return Foo.__gender
12 # obj=Foo()
13 # print(obj.get_gender())
14 print(Foo.get_gender())

通过静态方法,访问私有字段

 1 #案例 数据库账户
 2 class Database:
 3     __root="root"
 4     __pwd=‘abc123‘
 5     __port=‘3306‘
 6     __dbname=‘ssoa‘
 7     # def __init__(self,pwd):
 8     #     pass
 9 ###############只读模式########################
10     def get_root(self): #只能访问,不能修改  可读
11         return self.__root
12     def get_port(self):
13         return self.__port
14
15     ###########读写模式 #################
16     def get_pwd(self):  #获取密码
17         return self.__pwd
18     def set_pwd(self,pwd):  #修改密码
19         self.__pwd = pwd
20
21 db=  Database()
22 print(db.get_pwd()) #调用密码
23 db.set_pwd(‘456‘)   #修改密码
24 print(db.get_pwd())#调用密码

读写 只读

 1 class ClassFather:
 2     def __init__(self):
 3         self.__age=23
 4         self.score=90
 5
 6 class ClassSon(ClassFather):
 7     def __init__(self,name):
 8         self.name=name
 9         self.__gender=‘男‘
10         super().__init__()
11
12     def show(self):
13         print(self.name)
14         print(self.__gender)
15         print(self.score)
16         #print(self.__age)#私有字段只能在类的内部使用,不能被继承
17
18 s=ClassSon(‘李逵‘)
19 s.show()

私有字段只能在类的内部使用,不能被继承




类的特殊成员

__init__/__call__

 1 class Foo:
 2     def __init__(self): #对象后面加上() 自动执行 init 方法
 3         print(‘init‘)
 4
 5
 6     def __call__(self, *args, **kwargs):  ##对象后面加() 自动执行 call 方法
 7         print(‘call‘)
 8
 9
10 obj=Foo()
11 obj()##相当于 Foo()()

__int__/__str__

 1 class Foo:
 2     def __init__(self):
 3         pass
 4     def __int__(self):
 5         return 111
 6     def __str__(self):
 7         return ‘string‘
 8 obj=Foo()
 9
10 print(obj,‘\n‘,type(obj))
11
12 #int ,对象,自动执行对象的__int__ 方法,并将返回值赋值给int对象
13 r=int(obj)
14 print(r)
15 #str ,对象,自动执行对象的__str__ 方法,并将返回值赋值给str对象
16 t=str(obj)
17 print(t)

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
string
 <class ‘__main__.Foo‘>
111
string

Process finished with exit code 0

在实际使用中,使用__str__() 方法的频率更大

例如:

1 class Foo:
2     def __init__(self,name,age):
3         self.name=name
4         self.age=age
5
6 obj=Foo(‘Jach‘,12)
7 print(obj)

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
<__main__.Foo object at 0x000000000222D1D0>

Process finished with exit code 0

 1 class Foo:
 2     def __init__(self,name,age):
 3         self.name=name
 4         self.age=age
 5
 6     def __str__(self): #用于打印
 7         return ‘%s----%s‘%(self.name,self.age)
 8
 9 obj=Foo(‘Jach‘,12)
10 #如果直接调用对象打印出来,会默认直接调用 __str__ 方法
11 #内部先把‘print(obj)‘默认转换成>>>‘print(str(obj))‘ 获取其返回值
12 print(obj)

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
Jach----12

Process finished with exit code 0

__add__

 1 class Foo:
 2     def __init__(self,name,age):
 3         self.name=name
 4         self.age=age
 5
 6     def __add__(self, other):
 7         #self == obj(‘亚瑟‘,12)
 8         #other==obj(‘后羿‘,23)
 9         # return self.age+other.age
10         return Foo(self.name,other.age)
11
12 obj=Foo(‘亚瑟‘,12)
13 obj2=Foo(‘后羿‘,23)
14
15 r=obj+obj2
16 #两个相加时,会自动执行第一个对象的 __add__ 方法,并且把第二个参数当做参数传递进去
17 print(r,type(r))
18 print(r.name)
19 print(r.age)

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
<__main__.Foo object at 0x00000000024BD4E0> <class ‘__main__.Foo‘>
亚瑟
23

Process finished with exit code 0

构造方法 对象被创造的时候自动触发  __init__

析构方法 对象被销毁的时候自动触发  __del__

 1 class Foo:
 2     def __init__(self,name,age):
 3         self.name=name
 4         self.age=age
 5
 6     def __add__(self, other):
 7         #self == obj(‘亚瑟‘,12)
 8         #other==obj(‘后羿‘,23)
 9         # return self.age+other.age
10         return Foo(self.name,other.age)
11     def __del__(self):
12         print(‘析构方法,对象销毁时,自动执行‘)
13
14 obj=Foo(‘亚瑟‘,12)
15 obj2=Foo(‘后羿‘,23)
16
17 r=obj+obj2
18 #两个相加时,会自动执行第一个对象的 __add__ 方法,并且把第二个参数当做参数传递进去
19 print(r,type(r))
20 print(r.name)
21 print(r.age)

运行结果:

"D:\Program Files (x86)\python36\python.exe" F:/python从入门到放弃/7.24/面向对象.py
<__main__.Foo object at 0x0000000001EAD470> <class ‘__main__.Foo‘>
亚瑟
23
析构方法,对象销毁时,自动执行
析构方法,对象销毁时,自动执行
析构方法,对象销毁时,自动执行

Process finished with exit code 0

__dict__  #将对象中分装的所有内容,通过字典的形式,返回

原文地址:https://www.cnblogs.com/Mengchangxin/p/9365385.html

时间: 2024-11-05 21:50:34

python入门第二十四天----成员修饰符 类的特殊成员的相关文章

python入门第二十六天--网络通信

网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信. 举个例子,当你使用浏览器访问新浪网时,你的计算机就和新浪的某台服务器通过互联网连接起来了,然后,新浪的服务器把网页内容作为数据通过互联网传输到你的电脑上. 由于你的电脑上可能不止浏览器,还有QQ.Skype.Dropbox.邮件客户端等,不同的程序连接的别的计算机也会不同,所以,更确切地说,网络

Python入门(十四) 字符串

Python中的字符串可以是单引号''或者双引号""括起来,如果字符串比较长,需要垮行,可以使用三引号''' ''' errHtml = ''' <HTML><HEAD><TITLE> Python CGI Demo</TITLE></HEAD> <BODY><H3>ERROR</H3> <B>%s</B><P> <FORM><INPUT

python入门第二十九天-socketserver

简单并发实例 服务端: #!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/8/3 ''' import socketserver class MyServer(socketserver.BaseRequestHandler): #定义自己的类,继承固定的类 socketserver.BaseRequestHandler def handle(self): #方法名 必须用handle 为了重新父类的方法 pri

python设计模式第二十四天【命令模式】

1.使用场景 (1)调用过程比较繁琐,需要封装 (2)调用参数需要进行处理封装 (3)需要添加额外的功能,例如,日志,缓存,操作记录等 2.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from abc import ABCMeta, abstractmethod class Receiver(object): '''这时基本的类''' def __init__(self): pass def action_one(self): print

Spring入门第二十四课

Spring对JDBC的支持 直接看代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql.jdbc.Driver jdbc.jdbcUrl=jdbc:mysql://localhost:3306/selective-courses-system jdbc.initPoolSize=5 jdbc.maxPoolSize=10 applicationContext.xml <?xml ve

Python【第二十四课】Django rest framework

本节内容 Django rest framework 安装 Django rest framwwork 环境配置 简单举例说明 Django中使用 rest framework 1.1 安装 Django rest framework 建立新的环境 virtualenv env source env/bin/activate 安装 djangorestframework 模块 pip install django pip install djangorestframework pip insta

大数据入门第二十四天——SparkStreaming(2)与flume、kafka整合

前一篇中数据源采用的是从一个socket中拿数据,有点属于“旁门左道”,正经的是从kafka等消息队列中拿数据! 主要支持的source,由官网得知如下: 获取数据的形式包括推送push和拉取pull 一.spark streaming整合flume 1.push的方式 更推荐的是pull的拉取方式 引入依赖: <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streami

Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property. 获取特性 class Foo: def __init__(self,name): self.name = name #

Egret入门学习日记 --- 第二十四篇(书中 9.12~9.15 节 内容)

第二十四篇(书中 9.12~9.15 节 内容) 开始 9.12节 内容. 重点: 1.TextInput的使用,以及如何设置加密属性. 操作: 1.TextInput的使用,以及如何设置加密属性. 创建exml文件,拖入组件,设置好id. 这是显示密码星号处理的属性. 创建绑定类. 实例化,并运行. 但是焦点在密码输入框时,密码是显示的. 暂时不知道怎么设置 “焦点在密码框上时,还是显示为 * 号” 的方法. 至此,9.12节 内容结束. 开始 9.13节 . 这个,和TextInput的使用